4.2 uboot开发 - emmc 分区
- 成功进入系统后,使用命令
fdisk -l
查看硬盘信息,却打印出/dev/mmcblk0 doesn't contain a valid partition table
这样的信息。 - 使用命令
ls /dev/mmcblk0*
查看,确实又存在分区。 - 既然磁盘上没有分区表信息,那么内核中的分区表信息是哪来的?
- 左思右想,想起了上一篇文章中传递给内核的启动参数,其中有一段是这样的:
- blkdevparts=mmcblk0:1M(u-boot.bin),16M(kernel),19M(update),6144M(rootfs.ext4),8192M(oem),-(data)
- 感觉应该就是这个了,遂一通乱查,最后得知内核可以通过以下方式获取硬盘的分区信息:
- 控制器驱动提供分区表
- bootloader命令行(通过参数 blkdevparts 传递)
Emmc 分区简介
- 大部分 Emmc 在物理上存在以下分区:
- Boot Area Partition 1
- Boot Area Partition 2
- RPMB
- User Data Area
- Boot 分区主要是为了支持从 eMMC 启动系统而设计的。即 linux 下的
/dev/mmcblk0boot*
设备。 - RPMB 即 Replay Protected Memory Block 简称,通常用来保存安全线管的数据。即 linux 下的
/dev/mmcblk0rpmb
设备。 - User Data Area,可以通过软件修改的分区,一般的分区软件操作的都是这个区域。
- 以上几个分区在物理上隔离。
试试分区
-
通过
bootloader命令行
传递分区表给内核,会导致一系列从控制器驱动中读取分区表信息的软件无法使用。 -
大部分 emmc 的分区表都放在 emmc 设备的前 50KB 处。
-
这里得注意一点,通过
blkdevparts
可以得知,u-boot.bin
文件是直接从 emmc 的 0 地址处开始写的,也就是说,u-boot.bin
文件势必会将分区表覆盖掉。 -
通过以下命令试试能不能将
u-boot.bin
往后移移:# 先将 emmc 前 1M 清空 dd if=/dev/zero of=/dev/mmcblk0 count=2048 # 写入 uboot 镜像 dd if=boot_image.bin of=/dev/mmcblk0 # 重启设备,能成功启动则证明没问题 # 庆幸,启动成功了 # 再次将 emmc 前 1M 清空 dd if=/dev/zero of=/dev/mmcblk0 count=2048 # 写入 uboot 镜像,注意,这次朝后移动了一个扇区 dd if=boot_image.bin of=/dev/mmcblk0 seek=1 # 重启设备,能成功启动则证明没问题 # 妈蛋,失败成砖了,看来,只有用命令行传递了 # 成砖的话可以用前文介绍的烧写工具拯救