背景:

    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,有详细参数说明。

1. J6 Android eMMC 分区结构

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

    最开始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中定义,


通过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 分区.           所以要对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中


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

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

 在uboot中,设置环境变量:


附录:

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数据



更多相关文章

  1. Android(安卓)media媒体库分析之:分类别统计媒体文件大小
  2. Android重写ViewGroup实现卡片布局(三)
  3. 如何将图片压缩至固定大小以下
  4. android 限制EditText输入数字的范围大小
  5. android选择视频文件上传到后台服务器
  6. Android麦克风录音带音量大小动态显示的圆形自定义View
  7. Android设置全局字体大小,实现小中大字体功能
  8. Android(安卓)APP常用图标尺寸规范
  9. Android(安卓)在 TextView 中设置超链接、颜色、字体、图片

随机推荐

  1. Android技巧小结之新旧版本Notification
  2. Android仿IOS上拉下拉弹性效果的实例代码
  3. Android仿人人客户端(v5.7.1)——对从服务
  4. android中的事件传递和处理机制
  5. 【Android初学者】框架布局:仿微信页面制
  6. Android改变字体方法——Typeface
  7. Conversion to Dalvik format failed wit
  8. 如何在Ubuntu11.10(32位)下载Android4.0
  9. Android学习之界面篇(五)animateLayoutChan
  10. Unity与android互调用