Android Nand Flash 分区
?????? 但一般用戶不大明白這幾個芯片的區別,一般是就用ROM來指Nand Flash,RAM來指SDRAM之類設備。雖然在嵌入式編程,是專門有稱作ROM的器材,比如EEPROM。這里就是大家約定俗說法吧。因此這里的Android ROM實際就是指燒錄Nand Flash的各種二進制文件。
????? ?另外,賣數碼產品的喜歡把Nand Flash稱為內存,SD卡稱為外存,所以交流也只好這樣了。
??
?
從分區表看,
?<<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
?
一、手機的分區說明
我的HTC G8信息是 ,注意這里是Android的LINUX內核能看到分區,并不表示Flash上的所有分區,我的理解Hboot和radio分區在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分區
???????其中misc分區信息第一篇文章有解釋:保存設備配置信息:CID (Carrier or Region ID),USB和其它硬件設備配置信息,大約20K的樣子。引自? http://blog.chinaunix.net/space.php?uid=20543672&do=blog&id=94411?可能結構是
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分區?
???????recovery 分區即恢復分區,在正常分區被破壞后,仍可以進入這一分區進行備份和恢復.我的理解是這個分區保存一個簡單的OS或底層軟件,在Android的內核被破壞后可以用bootloader從這個分區引導進行操作。
boot 分區
??????? 一般的嵌入式Linux的設備中.bootloader,內核,根文件系統被分為三個不同分區。在Android做得比較復雜,從這個手機分區和來看,這里boot分區是把內核和ramdisk file的根文件系統打包在一起了,是編譯生成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]; ? ? ? ? ? ?/*幻數,一般固定為 ANDROID! */ ????unsigned kernel_size; /* size in bytes */ ? ? ? ?/*內核長度 ? ? ? ? ? ? ? ?*/ ????unsigned kernel_addr; /* physical load addr */ ? /*內核裝入地址 ? ? ? ? ? ? */? ????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 */ /*內核tags 即內核參數 物理地址 ? */ ????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 */ ?/*產品名稱 */???? ????unsigned char cmdline[BOOT_ARGS_SIZE]; ? ? ? ? ? ? ? ? ? /* Linux 內核引導參數,*/ ????unsigned id[8]; /* timestamp / checksum / sha1 / etc */ ? /*檢驗值 ? */ };
?這里的內核tags,應該就是指內核命令行參數,在頭文件里有如下注釋注明了,bootloader在引導LINUX 內核時,將會把寄存器r2保存tags addr,而在ARM-LINUX定義里 r1是機器碼,而r2就是引志命令行參數的偏移量, ** 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標準的zImage和zip格式,這里略掉其說明 文件系統分區. Linux必須有一個根文件系統分區,可以為多種格式,這里用的是可讀的ramdisk 格式,它啟動分隔一部分內存,掛載到/目錄下。 然后再用分三個不同權限分區來裝載不同子目錄.這里二個子目錄是 /system ,/userdata 并且內容是完全只讀的它將必須用root用戶 這種設計結構的出發點是這樣考慮,內核和根文件系統的由手機制造商控制,不讓用戶修改,而且system的分區保存重要的系統命令和框架程序。由官方來升級,對于用戶是只讀的。而且userdata目錄才是用戶自行管理的,比如下載的應用。 而啟動時最重要的root用戶并未對用戶公開,應用程序都是用普通用戶的如 app_xx這樣的帳號來運行。這樣可以有效保護/system的程序。 但是第三方的自制rom往往要修改/system的內容,因此刷機時要通過破解方法來取得root用戶權限。 system 分區這里是掛載到/system目錄下的分區,是一個yaffs2的文件系統,用普通的adb 命令是無法操作這個目錄的。這里有 /system/bin 和 /system/sbin 保存很多系統命令。它是由編譯出來的system.img來燒入。 userdata 分區
它也是一個yaffs2文件系統,它將掛載到 /data 目錄下, 它是由編譯出來的userdata.img來燒入。cache 分區 它也是一個yaffs2文件系統,它將掛載到 /cache 目錄下,看一般解釋,這里主要用升級的緩存,內容由運行而定.
cat /proc/mounts rootfs / rootfs ro,relatime 0 0 #根文件系統的格式,只讀 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分區,只讀 /dev/block/mtdblock5 /data yaffs2 rw,nosuid,nodev,relatime 0 0 #data分區,可讀寫 /dev/block/mtdblock4 /cache yaffs2 rw,nosuid,nodev,relatime 0 0 #cache分區,可讀寫
其它隱藏分區:? HBOOT 這里沒有看,保存的bootloader HBOOT,從源碼看不是u-boot的變種。Radio分區 保存是基帶芯片的固件代碼,Linux不認識其格式,在手機啟動時裝入特定內存中用于驅動芯片。所有與電信網絡交互就是靠它了,一般往往用專用開發環境來開發。splash分區 這里是啟動畫面。SD卡分區 一般默認的是掛載在/sdcard目錄,從我的機器看,好象沒有掛上。SD卡擴展分區
? ?它的目錄名是 /sd-ext ,它不是一個標準的Android分區,是運行APP2D軟件擴展出來分區。目的是為了多擴展一個安裝程序空間,這個對于Flash空間(或者說ROM空間)不夠,又喜歡安裝軟件的人是有用應用。 二.各分區詳細分析 ? 各個分區的內容,可以用cat命令直接導出,用一般的二進制的軟件來分析,我一般用WinHex,并且自己寫了幾個模板。導出分區內容,如果用adb 導出,必須有root權限,
總結
以上是生活随笔為你收集整理的Android Nand Flash 分区的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: USB相关结构体之struct usb_
- 下一篇: 使用Android内部的Download