J6 Android eMMC 分区介绍

背景:

    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 分区介绍_第1张图片

1. J6 Android eMMC 分区结构

       J6 Android系统的分区表的起始是从eMMC的User Data Area起始的,以下为J6 Android在eMMC上的分区结构

J6 Android eMMC 分区介绍_第2张图片

    最开始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上也会标明。

 2. J6 GPT分区表的创建

        J6分区表在dra7xx_evm.h中定义,

J6 Android eMMC 分区介绍_第3张图片

通过uboot中的命令行 gpt write mmc 1 $partitions_android可创建GPT 分区表。要注意的是userdata分区大小并不是固定的,该分区大小eMMC 容量和已用大小相关.所以对编译出的userdata.img需要单独做resize的处理,后续会有说明。

3.UserData 分区的处理

     J6 Android编译生成的system.img和userdata.img都是包含ext4文件系统信息的image。经过simg2img 处理后可以在linux系统上将该image m挂载成文件系统的形式,它包含了文件系统的全部信息。正因为user data分区跟具体emmc型号相关,所以该分区的大小是可变的。一般具体项目编译出来的userdata.img会有一个默认大小(Boardconfig.mk中配置),但最终实际的大小都需要做resize的处理。
    以J6 EVM板上8G eMMC为例,经计算,Android分区的UserDataPartition 大小为 6482271KB. 系统默认编译出来的userdata.img 是稀疏的(sparse类型)image,压缩了全0的数据.可以通过./simg2img userdata.img userdata.img.raw 将sparse形式的image还原为raw 的ext4的文件.
    查看userdata.img.raw大小,2147483648Byte,仅默认2GB大小空间.并不符合我们的 6482271KB的UserData 分区.
     J6 Android eMMC 分区介绍_第4张图片
     所以要对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中

J6 Android eMMC 分区介绍_第5张图片

3.2  Fastboot.sh脚本中怎么获取到userdata_size ? 

        TI提供的linux环境下的fastboot.sh中,会进行对userdata做resize操作,原理是怎样的?是如何获取当前emmc的userdata大小的呢。fastboot.sh中代码片段:

 在uboot中,设置环境变量:

J6 Android eMMC 分区介绍_第6张图片

附录:

mmc 相关的命令:

1. part list mmc 1显示分区信息

2. mmc subsystem命令

=> 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

3.kernel中查看分区信息

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

4. 查看emmc block设备信息:

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

5.通过dd命令读写emmcblock设备到u盘中,并通过winhex分析

1)例如分析J6 eMMC前128K数据

dd if=/dev/block/mmcblk0 of=/storage/udisk/dump_data1count=1bs=128k

见如下用winhex分析的emmc的前128K数据

J6 Android eMMC 分区介绍_第7张图片


你可能感兴趣的:(J6,Android开发)