最近想要回顧下之前的一些東西,記錄下一些簡單但細碎的東西,本章簡單從分區表入手隨便寫寫
分區表文件在common\config\partition_nand.xml
<partition>
<name length="16" type="string">0:boot</name>//分區名
<size_kb length="4">7500</size_kb>//大小必須爲block整數,block 爲64個page,也可以直接用size_blks
<pad_kb length="4">500</pad_kb>//大小必須爲block整數,block 爲64個page,也可以直接用spad_blks
<which_flash>0</which_flash>
<attr>0xFF</attr>
<attr>0x01</attr>
<attr>0x00</attr>
<attr>0xFF</attr>
<img_name type="string">mdm9607-boot.img</img_name>//固件名稱
</partition>
以一個分區的配置爲例,定義了一個boot的分區,大小爲7500kb + 500 kb,但是最後是需要取整到block,以128kb block size來看,最後大小爲(59+4)*128kb 換算稱 16進制就是 007e0000
這個可以從mtd中看到
cat proc/mtd
dev: size erasesize name
mtd0: 00140000 00020000 "sbl"
mtd1: 00140000 00020000 "mibib"
mtd2: 00c00000 00020000 "efs2"
mtd3: 000c0000 00020000 "tz"
mtd4: 00060000 00020000 "rpm"
mtd5: 000a0000 00020000 "aboot"
mtd6: 007e0000 00020000 "boot"
mtd7: 00be0000 00020000 "scrub"
mtd8: 02440000 00020000 "modem"
mtd9: 007c0000 00020000 "recovery"
mtd10: 00180000 00020000 "fota"
mtd11: 00f20000 00020000 "recoveryfs"
mtd12: 00040000 00020000 "sec"
mtd13: 09500000 00020000 "system"
從mtd 文件看到flash分爲13個mtd分區。下面簡單的介紹下每個分區的含義以及對應的固件
SBL:sbl1.mbn 可以看做軟件最開始的入口,固定位置,由芯片固化PBL 跳轉
mibib:分區表
efs2:modem efs 文件系統
tz,rpm:trustzone rpm
aboot:lk,ap的BootLoader
boot:kernel mdm9607-boot.img
srub:flash srub 功能的交換區
modem:mp
recovery:升級的kernel,與boot燒錄一樣的
recoveryfs:升級的ubifs,只有部分必要的功能
system:ubifs
可以看到flash中存儲了兩個kernel 和兩個fs,一個用於正常工作,一個用於升級操作。具體加載選擇在lk中通過cmdline傳遞加載哪個fs。下面就是加載mtd13的正常system fs
rootfstype=ubifs rootflags=bulk_read,sync root=ubi0:rootfs ubi.mtd=13
mdm平臺中的fs都是採用的ubifs,包含的三個文件系統:system ,recoveryfs,modem都是ubifs
從上面的cmdline中看到ubi0:rootfs,說明整個ubi0應該有分成不同的volume,具體需要追究下編譯過程中的ubifs製作:
apps_proc\oe-core\meta-qcom\recipes\images\mdm-usr-image.inc 中頂一個了最後製作ubifs的命令
ubinize -o ${OUTPUT_FILE_FINAL_UBI} ${UBINIZE_ARGS} ${UBINIZE_CFG}
UBINIZE_CFG 也是在這個文件中生成,可以在生成路徑中查詢apps_proc/oe-core/build/tmp-glibc/deploy/images/mdm9607/ubinize_system_userdata.cfg,最後的結果爲
[sysfs_volume]
mode=ubi
image=apps_proc/oe-core/build/tmp-glibc/deploy/images/mdm9607/mdm-image-mdm9607.ubifs
vol_id=0
vol_type=dynamic
vol_name=rootfs
vol_size=53MiB
[usrfs_volume]
mode=ubi
image=apps_proc/oe-core/build/tmp-glibc/deploy/images/mdm9607/mdm9607-usrfs.ubifs
vol_id=1
vol_type=dynamic
vol_name=usrfs
vol_flags = autoresize
[cache_volume]
mode=ubi
vol_id=2
vol_type=dynamic
vol_name=cachefs
vol_size=75MiB
所以整個ubi0被分成了三個volume,cachefs是空的,所以沒有指定image
UBINIZE_ARGS 在apps_proc\oe-core\meta-msm\conf\machine\mdm9607.conf定義
#UBINIZE Args
UBINIZE_ARGS = "-m 2048 -p 131072 -s 2048"
#MKUBIFS Args
MKUBIFS_ARGS = "-m 2048 -e 126976 -c 2146 -F"
#Volume sizes
SYSTEM_VOLUME_SIZE = "53MiB"
CACHE_VOLUME_SIZE = "75MiB"
rootfs 的ubi文件是由meta/classes/image_types.bbclass來生成。一般不需要修改
usrfs 的ubi文件是在mdm-usr-image.inc生成。
那之前cmdline中只講第一個rootfs掛載爲root,其他的兩個volume是由apps_proc\oe-core\meta-msm\recipes\startup-scripts\files\mdm9607 find_partitions.sh 腳本在啓動時掛載
eval FindAndMountVolume${fstype} usrfs /data
eval FindAndMountVolume${fstype} cachefs /cache
eval FindAndMount${fstype} modem /firmware
modem的ubifs名稱爲NON-HLOS.ubi,製作ubifs 的配置文件在common\config\my_ubi.ini,相應的mkfs.ubifs,ubinize配置在common\build\contents.xml中
<step type="exec">
<params>@tool_name -r @src_dir -o @destn_image -m @min_ip_op_unit_size -e @eraseblock_size -c @max_file_system_size_logical_eraseblocks -F</params>
<tool_name>mkfs.ubifs</tool_name>
<src_dir>./bin</src_dir>
<max_file_system_size_logical_eraseblocks>2146</max_file_system_size_logical_eraseblocks>
<eraseblock_size>126976</eraseblock_size>
<min_ip_op_unit_size>2048</min_ip_op_unit_size>
<destn_image>NON-HLOS.ubifs</destn_image>
</step>
<step type="exec">
<params>@tool_name -v -o @destn_image -m @min_ip_op_unit_size -p @physical_eraseblock_size -s @sub_page_size ./../config/my_ubi.ini</params>
<tool_name>ubinize</tool_name>
<min_ip_op_unit_size>2048</min_ip_op_unit_size>
<physical_eraseblock_size>131072</physical_eraseblock_size>
<sub_page_size>2048</sub_page_size>
<destn_image>NON-HLOS.ubi</destn_image>
</step>