日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android Nand Flash 分区

發(fā)布時(shí)間:2025/4/5 Android 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Nand Flash 分区 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一般的嵌入式Linux開發(fā)人員是要清晰區(qū)分不同器材的作用和名稱的。比如系統(tǒng),內(nèi)核所有保存在Nand Flash之上,斷電后仍然存在,而運(yùn)行后程序是裝入SDRAM或Mobile DDR之類的內(nèi)存設(shè)備運(yùn)行。
?????? 但一般用戶不大明白這幾個(gè)芯片的區(qū)別,一般是就用ROM來(lái)指Nand Flash,RAM來(lái)指SDRAM之類設(shè)備。雖然在嵌入式編程,是專門有稱作ROM的器材,比如EEPROM。這里就是大家約定俗說(shuō)法吧。因此這里的Android ROM實(shí)際就是指燒錄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

?

一、手機(jī)的分區(qū)說(shuō)明


我的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ù).我的理解是這個(gè)分區(qū)保存一個(gè)簡(jiǎn)單的OS或底層軟件,在Android的內(nèi)核被破壞后可以用bootloader從這個(gè)分區(qū)引導(dǎo)進(jìn)行操作。

boot 分區(qū)


??????? 一般的嵌入式Linux的設(shè)備中.bootloader,內(nèi)核,根文件系統(tǒng)被分為三個(gè)不同分區(qū)。在Android做得比較復(fù)雜,從這個(gè)手機(jī)分區(qū)和來(lái)看,這里boot分區(qū)是把內(nèi)核和ramdisk file的根文件系統(tǒng)打包在一起了,是編譯生成boot.img來(lái)燒錄的。它有如下格式。? ?

?boot header?1 page
?kernel??n pages
?ramdisk?m pages
?second stage?o pages
n = (kernel_size + page_size - 1) / page_sizem = (ramdisk_size + page_size - 1) / page_sizeo = (second_size + page_size - 1) / page_size0. all entities are page_size aligned in flash1. kernel and ramdisk are required (size != 0)2. second is optional (second_size == 0 -> no second)這里表示boot分區(qū)有四個(gè)部分,其中前三部分是必須的,而第四部分 second stage 可選。 每部分的大小是一個(gè)flash page的倍數(shù),不足一頁(yè)的需要加入空格字符補(bǔ)齊成一頁(yè)。其中bootl header是一些特定的數(shù)據(jù)結(jié)構(gòu)。每種手機(jī)有細(xì)微的差別。但是它是有一個(gè)統(tǒng)一個(gè)數(shù)據(jù)結(jié)構(gòu)參見?bootloader/legacy/include/boot/bootimg.h 中 boot_img_hdr

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)核長(zhǎng)度 ? ? ? ? ? ? ? ?*/ ????unsigned kernel_addr; /* physical load addr */ ? /*內(nèi)核裝入地址 ? ? ? ? ? ? */? ????unsigned ramdisk_size; /* size in bytes */ ? ? ? /*ramdisk 長(zhǎng)度 ? ? ? ? ? ?*/ ????unsigned ramdisk_addr; /* physical load addr */ ?/* ramdisk 裝入地址 ? ? ? ?*/ ? ????unsigned second_size; /* size in bytes */ ? ? ? ?/* second stage 長(zhǎng)度 ? ? ?*/ ????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頁(yè)尺寸,取決于flash型號(hào) */ ????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 */ ? /*檢驗(yàn)值 ? */ };

?這里的內(nèi)核tags,應(yīng)該就是指內(nèi)核命令行參數(shù),在頭文件里有如下注釋注明了,bootloader在引導(dǎo)LINUX 內(nèi)核時(shí),將會(huì)把寄存器r2保存tags addr,而在ARM-LINUX定義里 r1是機(jī)器碼,而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格式,這里略掉其說(shuō)明 文件系統(tǒng)分區(qū). Linux必須有一個(gè)根文件系統(tǒng)分區(qū),可以為多種格式,這里用的是可讀的ramdisk 格式,它啟動(dòng)分隔一部分內(nèi)存,掛載到/目錄下。 然后再用分三個(gè)不同權(quán)限分區(qū)來(lái)裝載不同子目錄.這里二個(gè)子目錄是 /system ,/userdata 并且內(nèi)容是完全只讀的它將必須用root用戶 這種設(shè)計(jì)結(jié)構(gòu)的出發(fā)點(diǎn)是這樣考慮,內(nèi)核和根文件系統(tǒng)的由手機(jī)制造商控制,不讓用戶修改,而且system的分區(qū)保存重要的系統(tǒng)命令和框架程序。由官方來(lái)升級(jí),對(duì)于用戶是只讀的。而且userdata目錄才是用戶自行管理的,比如下載的應(yīng)用。 而啟動(dòng)時(shí)最重要的root用戶并未對(duì)用戶公開,應(yīng)用程序都是用普通用戶的如 app_xx這樣的帳號(hào)來(lái)運(yùn)行。這樣可以有效保護(hù)/system的程序。 但是第三方的自制rom往往要修改/system的內(nèi)容,因此刷機(jī)時(shí)要通過(guò)破解方法來(lái)取得root用戶權(quán)限。 system 分區(qū)
這里是掛載到/system目錄下的分區(qū),是一個(gè)yaffs2的文件系統(tǒng),用普通的adb 命令是無(wú)法操作這個(gè)目錄的。這里有 /system/bin 和 /system/sbin 保存很多系統(tǒng)命令。它是由編譯出來(lái)的system.img來(lái)燒入。 userdata 分區(qū)
它也是一個(gè)yaffs2文件系統(tǒng),它將掛載到 /data 目錄下, 它是由編譯出來(lái)的userdata.img來(lái)燒入。cache 分區(qū) 它也是一個(gè)yaffs2文件系統(tǒng),它將掛載到 /cache 目錄下,看一般解釋,這里主要用升級(jí)的緩存,內(nèi)容由運(yùn)行而定.

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)識(shí)其格式,在手機(jī)啟動(dòng)時(shí)裝入特定內(nèi)存中用于驅(qū)動(dòng)芯片。所有與電信網(wǎng)絡(luò)交互就是靠它了,一般往往用專用開發(fā)環(huán)境來(lái)開發(fā)。splash分區(qū) 這里是啟動(dòng)畫面。SD卡分區(qū) 一般默認(rèn)的是掛載在/sdcard目錄,從我的機(jī)器看,好象沒有掛上。SD卡擴(kuò)展分區(qū)
? ?它的目錄名是 /sd-ext ,它不是一個(gè)標(biāo)準(zhǔn)的Android分區(qū),是運(yùn)行APP2D軟件擴(kuò)展出來(lái)分區(qū)。目的是為了多擴(kuò)展一個(gè)安裝程序空間,這個(gè)對(duì)于Flash空間(或者說(shuō)ROM空間)不夠,又喜歡安裝軟件的人是有用應(yīng)用。 二.各分區(qū)詳細(xì)分析 ? 各個(gè)分區(qū)的內(nèi)容,可以用cat命令直接導(dǎo)出,用一般的二進(jìn)制的軟件來(lái)分析,我一般用WinHex,并且自己寫了幾個(gè)模板。導(dǎo)出分區(qū)內(nèi)容,如果用adb 導(dǎo)出,必須有root權(quán)限,

總結(jié)

以上是生活随笔為你收集整理的Android Nand Flash 分区的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。