android的存储分为两种
一种叫做RAM,如emmc标准的ddr2/3/4,容量比较小
一种叫做ROM,rom大小比较大,如8G/16G/32G/64G/128G。
我们给手机刷机,是把system.img/recovery.img/userdata.img等按照分区表烧写在对应地址的ROM上,这部分叫系统部分,如16G的手机,开机后只有11G,
其中5G被这些分区占据了,用户能使用的存储大小为11G。
我们在bootloader阶段会从boot/recovery分区中读取kernel/ramdisk到ram上,然后引导kernel,加载虚拟文件系统ramdisk,启动init,然后读取rom中的文件系统的内容。
在boot.img/recovery.img的内容如下,bootloader会从boot header得到kernel/ramdisk/second/device的大小和要加载到ram上的地址,读取aboot/recovery分区的内容到ram上。
recovery.img/boot.img的构成是一样的,只是里面文件的大小和信息不同,文件名是一样的。
struct boot_img_hdr
{
unsigned char magic[BOOT_MAGIC_SIZE];
unsigned kernel_size; /* size in bytes */ //kernel表示zImage的实际大小
unsigned kernel_addr; /* physical load addr */ //kernel的zImage载入内存的物理地址,也是bootloader要跳转的地址
unsigned ramdisk_size; /* size in bytes */ //ramdisk的实际大小
unsigned ramdisk_addr; /* physical load addr */ //ramdisk加载到内存的实际物理地址,之后kernel会解压并把它挂载成根文件系统,我们的中枢神经-init.rc就隐藏于内
unsigned second_size; /* size in bytes */
unsigned second_addr; /* physical load addr */
unsigned tags_addr; /* physical addr for kernel tags */ //tags_addr是传参数用的物理内存地址,它作用是把bootloader中的参数传递给kernel,参数放在这个地址上
unsigned page_size; /* flash page size we assume */ //page_size是存储芯片(ram/emmc)的页大小,取决与存储芯片
unsigned unused[2]; /* future expansion: should be 0 */
unsigned char name[BOOT_NAME_SIZE]; /* asciiz product name */
unsigned char cmdline[BOOT_ARGS_SIZE]; //command line它可以由bootloader向kernel传参的内容,存放在tag_addr地址
unsigned id[8]; /* timestamp / checksum / sha1 / etc */
};
MTK分区表存放位置:device/mediatek/build/build/tools/ptgen/xxx/xxx.xls
ptgen.pl文件会把xls文件解析成xxxAndroid_scatter.txt放在out/target/product/xxx/中
mtk的flashtool工具会读取这个文件把相关的镜像烧写到rom中。
高通分区表存放位置:不同项目,位置不同,用find搜索partition.xml $find . -name "*partition*.xml",最后会生成rawprogram0.xml文件,
高通的刷机工具会根据这个文件把相关的镜像烧写到rom中。
如 MTK6737M android 6.0 分区表存放位置
device/mediatek/build/build/tools/ptgen/MT6737M/partition_table_MT6737M.xls
./device/mediatek/build/build/makemtk.mk:105:MEM_PARTITION_TABLE := mediatek/build/tools/ptgen/$(MTK_PLATFORM)/partition_table_$(MTK_PLATFORM).xls
ptgen.pl文件会把xls文件解析成MT6737M_Android_scatter.txt 放在out/target/product/b602_37m_34g_s_m0/中
./device/mediatek/build/build/tools/ptgen/MT6737M/ptgen.pl:226: $Partition_layout_xls = "$ptgen_location/partition_table_$ArgList{PLATFORM}.xls";
mtk的flashtool工具会读取这个文件把相关的镜像烧写到rom中。