emmc的物理分区有boot partition,boot partition2以及RPMB(Replay Protected Memory Block),GPAP(GeneralPurpose Area Partitions,最多可以有4个),UDA(User Data Area)分区。而我们一般只知道UDA分区。一般我们的Android或linux分区都会建立在User data Area。具体型号的eMMC每个物理分区的大小,可以参考对应的eMMC的datasheet,有详细参数说明。
J6 Android系统的分区表的起始是从eMMC的User Data Area起始的,以下为J6 Android在eMMC上的分区结构
2. J6 GPT分区表的创建最开始128K空间,共256个block(每个block是512Byte)。block0 是传统的MBR分区(包含MBR分区标记),但并不包含实际的分区表信息。J6 Android采用的是GPT分区表,从block1开始是GPT分区表信息。软件这块可以通过gpt write 命令的代码流程分析,也可以通过dd命令dump出eMMC前128K数据来分析。后面都会有分析。 剩余空间大小,分为固定大小空间和可变空间大小(user data由eMMC决定)。
固定分区大小:
128K+128K+768K+128K+128K+384K+16M+16K+10M+10M+768M+256M+8M+8M+8M+8M+17KB
=1119905KB
eMMC可用用户数据区大小:mmc->capacity= 0x1d0000000 = 7602176KB
计算出Android User Data 分区的大小:7602176KB- 1119905KB = 6482271KB
其中User Data分区的大小跟具体某款eMMC型号相关,可通过eMMC的CSD相关寄存器可以读取,一般datasheet上也会标明。
J6分区表在dra7xx_evm.h中定义,
通过uboot中的命令行 gpt write mmc 1 $partitions_android可创建GPT 分区表。要注意的是userdata分区大小并不是固定的,该分区大小eMMC 容量和已用大小相关.所以对编译出的userdata.img需要单独做resize的处理,后续会有说明。
1) 将这种raw的ext4格式的image mount到某个目录下(data)
mount -o loop -o grpid -t ext4./userdata.img.raw ./data
2)通过make_ext4fs将data目录制作成(指定分区大小userdatasize})sparse格式的userdata_new.img.
./make_ext4fs -s -l ${userdatasize}K -a datauserdata_new.img data/
最后将resize过后的userdata_new.img通过fastboot flash命令烧录的指定的分区,并不需要单独的格式化分区.
3.1 Android默认编译出的image大小如何配置?
配置文件在mydroid\device\ti\jacinto6evm\BoradConfig.mk中
TI提供的linux环境下的fastboot.sh中,会进行对userdata做resize操作,原理是怎样的?是如何获取当前emmc的userdata大小的呢。fastboot.sh中代码片段:
在uboot中,设置环境变量:
mmc 相关的命令:
=> mmc info (mmc info 默认是显示mmc 0,也就是SD卡,没插卡就显示no carpresent)
MMC: no card present
因为J6上,emmc是mmc1设备,要看mmc1的信息,需要通过
mmc dev [dev] [part] - show or set currentmmc device [partition]
设置mmc 1
输入:
=> mmc dev 1
switch to partitions #0, OK
mmc1(part 0) is current device
=> mmc info
Device: OMAP SD/MMC
Manufacturer ID: fe
OEM: 14e
Name: MMC08
Tran Speed: 200000000
Rd Block Len: 512
MMC version 4.5
High Capacity: Yes
Capacity: 7.3 GiB
Bus Width: 8-bit
Erase Group Size: 512 KiB
HC WP Group Size: 8 MiB
User Capacity: 7.3 GiB WRREL
Boot Capacity: 8 MiB ENH
RPMB Capacity: 128 KiB ENH
shell@jacinto6evm:/ $ cat /proc/partitions
major minor #blocks name
179 0 7602176 mmcblk0
179 1 128 mmcblk0p1
179 2 768 mmcblk0p2
179 3 128 mmcblk0p3
179 4 128 mmcblk0p4
179 5 384 mmcblk0p5
179 6 16384 mmcblk0p6
179 7 16 mmcblk0p7
179 8 10240 mmcblk0p8
179 9 10240 mmcblk0p9
179 10 786432 mmcblk0p10
179 11 262144 mmcblk0p11
179 12 8192 mmcblk0p12
179 13 8192 mmcblk0p13
179 14 8192 mmcblk0p14
179 15 8192 mmcblk0p15
259 0 6482271 mmcblk0p16
179 32 8192 mmcblk0boot1
179 16 8192 mmcblk0boot0
shell@jacinto6evm:/dev/block $ ls
mmcblk0
mmcblk0boot0
mmcblk0boot1
mmcblk0p1
mmcblk0p10
mmcblk0p11
mmcblk0p12
mmcblk0p13
mmcblk0p14
mmcblk0p15
mmcblk0p16
mmcblk0p2
mmcblk0p3
mmcblk0p4
mmcblk0p5
mmcblk0p6
mmcblk0p7
mmcblk0p8
mmcblk0p9
其中mmcblk0p1~mmcblk0p16分别代表gpt中分区分出来的16个分区。
mmcblk0代表emmc 1设备
mmcblk0boot0代表emmc的物理boot分区1
mmcblk0boot1代表emmc的物理boot分区2
1)例如分析J6 eMMC前128K数据
dd if=/dev/block/mmcblk0 of=/storage/udisk/dump_data1count=1bs=128k
见如下用winhex分析的emmc的前128K数据