Android Nand Flash 分区
?????? 但一般用戶不大明白這幾個芯片的區(qū)別,一般是就用ROM來指Nand Flash,RAM來指SDRAM之類設(shè)備。雖然在嵌入式編程,是專門有稱作ROM的器材,比如EEPROM。這里就是大家約定俗說法吧。因此這里的Android ROM實際就是指燒錄Nand Flash的各種二進(jìn)制文件。
????? ?另外,賣數(shù)碼產(chǎn)品的喜歡把Nand Flash稱為內(nèi)存,SD卡稱為外存,所以交流也只好這樣了。
??
?
從分區(qū)表看,
?<<Android Partitions Explained: boot, system, recovery, data, cache & misc>>
?? http://www.addictivetips.com/mobile/android-partitions-explained-boot-system-recovery-data-cache-misc/
?<<HOWTO: Unpack, Edit, and Re-Pack Boot Images>>
? http://android-dls.com/wiki/index.php?title=HOWTO:_Unpack%2C_Edit%2C_and_Re-Pack_Boot_Images
?
一、手機的分區(qū)說明
我的HTC G8信息是 ,注意這里是Android的LINUX內(nèi)核能看到分區(qū),并不表示Flash上的所有分區(qū),我的理解Hboot和radio分區(qū)在toolbox就看不到。
????
cat /proc/mtd dev: size erasesize name mtd0: 000a0000 00020000 "misc" mtd1: 00420000 00020000 "recovery" mtd2: 002c0000 00020000 "boot" mtd3: 0fa00000 00020000 "system" mtd4: 02800000 00020000 "cache" mtd5: 0af20000 00020000 "userdata"
MISC分區(qū)
???????其中misc分區(qū)信息第一篇文章有解釋:保存設(shè)備配置信息:CID (Carrier or Region ID),USB和其它硬件設(shè)備配置信息,大約20K的樣子。引自? http://blog.chinaunix.net/space.php?uid=20543672&do=blog&id=94411?可能結(jié)構(gòu)是
0x00 ?CID 0x10 ?enter_bootloader 0x20 ?cold boot (DeviceWarmBoot) 0x30 ?goupdateloader 0x40 ?(NBH) 0x50 CE Serial InUse\0 0x60 ?Debug Cable Ena\0 0x70 ?CE USB InUse\0 0x80 ?(IMG) 0x90 ?ClearAutoImage \0 0xa0 *.**.***.*\0(HBoot version)
recovery分區(qū)?
???????recovery 分區(qū)即恢復(fù)分區(qū),在正常分區(qū)被破壞后,仍可以進(jìn)入這一分區(qū)進(jìn)行備份和恢復(fù).我的理解是這個分區(qū)保存一個簡單的OS或底層軟件,在Android的內(nèi)核被破壞后可以用bootloader從這個分區(qū)引導(dǎo)進(jìn)行操作。
boot 分區(qū)
??????? 一般的嵌入式Linux的設(shè)備中.bootloader,內(nèi)核,根文件系統(tǒng)被分為三個不同分區(qū)。在Android做得比較復(fù)雜,從這個手機分區(qū)和來看,這里boot分區(qū)是把內(nèi)核和ramdisk file的根文件系統(tǒng)打包在一起了,是編譯生成boot.img來燒錄的。它有如下格式。? ?
| ?boot header | ?1 page |
| ?kernel? | ?n pages |
| ?ramdisk | ?m pages |
| ?second stage | ?o pages |
typedef struct boot_img_hdr boot_img_hdr; #define BOOT_MAGIC "ANDROID!" #define BOOT_MAGIC_SIZE 8 #define BOOT_NAME_SIZE 16 #define BOOT_ARGS_SIZE 512 struct boot_img_hdr { ????unsigned char magic[BOOT_MAGIC_SIZE]; ? ? ? ? ? ?/*幻數(shù),一般固定為 ANDROID! */ ????unsigned kernel_size; /* size in bytes */ ? ? ? ?/*內(nèi)核長度 ? ? ? ? ? ? ? ?*/ ????unsigned kernel_addr; /* physical load addr */ ? /*內(nèi)核裝入地址 ? ? ? ? ? ? */? ????unsigned ramdisk_size; /* size in bytes */ ? ? ? /*ramdisk 長度 ? ? ? ? ? ?*/ ????unsigned ramdisk_addr; /* physical load addr */ ?/* ramdisk 裝入地址 ? ? ? ?*/ ? ????unsigned second_size; /* size in bytes */ ? ? ? ?/* second stage 長度 ? ? ?*/ ????unsigned second_addr; /* physical load addr */ ? /* second staget 裝入地址 ?*/ ????unsigned tags_addr; /* physical addr for kernel tags */ /*內(nèi)核tags 即內(nèi)核參數(shù) 物理地址 ? */ ????unsigned page_size; /* flash page size we assume */ ? /* flash頁尺寸,取決于flash型號 */ ????unsigned unused[2]; /* future expansion: should be 0 */ /* 保留未用字段 */ ????unsigned char name[BOOT_NAME_SIZE]; /* asciiz product name */ ?/*產(chǎn)品名稱 */???? ????unsigned char cmdline[BOOT_ARGS_SIZE]; ? ? ? ? ? ? ? ? ? /* Linux 內(nèi)核引導(dǎo)參數(shù),*/ ????unsigned id[8]; /* timestamp / checksum / sha1 / etc */ ? /*檢驗值 ? */ };
?這里的內(nèi)核tags,應(yīng)該就是指內(nèi)核命令行參數(shù),在頭文件里有如下注釋注明了,bootloader在引導(dǎo)LINUX 內(nèi)核時,將會把寄存器r2保存tags addr,而在ARM-LINUX定義里 r1是機器碼,而r2就是引志命令行參數(shù)的偏移量, ** 4. prepare tags at tag_addr. kernel_args[] is ** appended to the kernel commandline in the tags. ** 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr 而kernel 和ramdisk則是LINUX標(biāo)準(zhǔn)的zImage和zip格式,這里略掉其說明 文件系統(tǒng)分區(qū). Linux必須有一個根文件系統(tǒng)分區(qū),可以為多種格式,這里用的是可讀的ramdisk 格式,它啟動分隔一部分內(nèi)存,掛載到/目錄下。 然后再用分三個不同權(quán)限分區(qū)來裝載不同子目錄.這里二個子目錄是 /system ,/userdata 并且內(nèi)容是完全只讀的它將必須用root用戶 這種設(shè)計結(jié)構(gòu)的出發(fā)點是這樣考慮,內(nèi)核和根文件系統(tǒng)的由手機制造商控制,不讓用戶修改,而且system的分區(qū)保存重要的系統(tǒng)命令和框架程序。由官方來升級,對于用戶是只讀的。而且userdata目錄才是用戶自行管理的,比如下載的應(yīng)用。 而啟動時最重要的root用戶并未對用戶公開,應(yīng)用程序都是用普通用戶的如 app_xx這樣的帳號來運行。這樣可以有效保護(hù)/system的程序。 但是第三方的自制rom往往要修改/system的內(nèi)容,因此刷機時要通過破解方法來取得root用戶權(quán)限。 system 分區(qū)這里是掛載到/system目錄下的分區(qū),是一個yaffs2的文件系統(tǒng),用普通的adb 命令是無法操作這個目錄的。這里有 /system/bin 和 /system/sbin 保存很多系統(tǒng)命令。它是由編譯出來的system.img來燒入。 userdata 分區(qū)
它也是一個yaffs2文件系統(tǒng),它將掛載到 /data 目錄下, 它是由編譯出來的userdata.img來燒入。cache 分區(qū) 它也是一個yaffs2文件系統(tǒng),它將掛載到 /cache 目錄下,看一般解釋,這里主要用升級的緩存,內(nèi)容由運行而定.
cat /proc/mounts rootfs / rootfs ro,relatime 0 0 #根文件系統(tǒng)的格式,只讀 tmpfs /dev tmpfs rw,relatime,mode=755 0 0 devpts /dev/pts devpts rw,relatime,mode=600 0 0 proc /proc proc rw,relatime 0 0 sysfs /sys sysfs rw,relatime 0 0 none /acct cgroup rw,relatime,cpuacct 0 0 tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0 none /dev/cpuctl cgroup rw,relatime,cpu 0 0 /dev/block/mtdblock3 /system yaffs2 ro,relatime 0 0 #system分區(qū),只讀 /dev/block/mtdblock5 /data yaffs2 rw,nosuid,nodev,relatime 0 0 #data分區(qū),可讀寫 /dev/block/mtdblock4 /cache yaffs2 rw,nosuid,nodev,relatime 0 0 #cache分區(qū),可讀寫
其它隱藏分區(qū):? HBOOT 這里沒有看,保存的bootloader HBOOT,從源碼看不是u-boot的變種。Radio分區(qū) 保存是基帶芯片的固件代碼,Linux不認(rèn)識其格式,在手機啟動時裝入特定內(nèi)存中用于驅(qū)動芯片。所有與電信網(wǎng)絡(luò)交互就是靠它了,一般往往用專用開發(fā)環(huán)境來開發(fā)。splash分區(qū) 這里是啟動畫面。SD卡分區(qū) 一般默認(rèn)的是掛載在/sdcard目錄,從我的機器看,好象沒有掛上。SD卡擴展分區(qū)
? ?它的目錄名是 /sd-ext ,它不是一個標(biāo)準(zhǔn)的Android分區(qū),是運行APP2D軟件擴展出來分區(qū)。目的是為了多擴展一個安裝程序空間,這個對于Flash空間(或者說ROM空間)不夠,又喜歡安裝軟件的人是有用應(yīng)用。 二.各分區(qū)詳細(xì)分析 ? 各個分區(qū)的內(nèi)容,可以用cat命令直接導(dǎo)出,用一般的二進(jìn)制的軟件來分析,我一般用WinHex,并且自己寫了幾個模板。導(dǎo)出分區(qū)內(nèi)容,如果用adb 導(dǎo)出,必須有root權(quán)限,
總結(jié)
以上是生活随笔為你收集整理的Android Nand Flash 分区的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: USB相关结构体之struct usb_
- 下一篇: 在游戏中强制关机,不能对关机提示框进行操