MTK android-partition分析

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中。

猜你喜欢

转载自blog.csdn.net/alifrank/article/details/82787966
MTK