论坛元老
- 积分
- 3571
- 金钱
- 3571
- 注册时间
- 2014-12-2
- 在线时间
- 365 小时
|
发表于 2020-12-20 12:58:46
|
显示全部楼层
1. 这是否类似Window的C/D/E/F盘?
是。
2. EMMC的分区是在什么时候进行的 ?
使用MFG TOOL烧录固件时,专门有一步骤给eMMC分区。
3. # ls /dev/mmcblk1
mmcblk1 mmcblk1boot0 mmcblk1boot1 mmcblk1p1 mmcblk1p2 mmcblk1rpmb
这几个都是保存的什么东西?
mmcblk1 - 设备文件,既表示开发板上的eMMC这颗芯片本身,也表示这颗eMMC的UDA分区。
mmcblk1boot0/mmcblk1boot1 - eMMC芯片的两个BOOT物理分区,用于存储BOOT镜像(通常为u-boot)
mmcblk1p1/mmcblk1p2 - eMMC的UDA分区通过软件手动分出来的两个子分区
mmcblk1rpmb - eMMC的读写保护分区,用于存放安全内容(指纹、支付、密钥等信息),写入的时候需要特殊的机制确保不会被非法写入,读取的时候也提供签名,保证读取出来的内容时安全的。
传统的硬盘、Nand/Nor Flash和普通的SD卡这些存储器件都有一个共同的特点,就是它们的存储空间是只有一个统一编址,从0x00000000一直到存储容量(Nand中间可能有坏块);
而eMMC不同,它在物理上是有多个分区的,最多可以有八个分区(如下图所示),这些分区都是独立编址的,切换访问不同的分区需要写eMMC特定的寄存器。
BOOT分区
在Linux下显示为/dev/mmcblk1boot0、/dev/mmcblk1boot1
boot分区有两个,容量相等,一般都为4MB(有的可以通过配置修改这部分容量);
一般可以把BOOT固件或关键数据放到这里,这部分的存储采用SLC单元,安全很有保障,绝对不会坏;
eMMC的BOOT分区设计来是为了方便芯片启动的,按照eMMC协议,只需要非常简单的时序,就可以把BOOT分区的内容读取出来,这极大地简化了芯片内部的BootROM设计;
两个BOOT分区只有一个可以激活设置为BOOT内容。
RPMB分区
在Linux下显示为/dev/mmcblk1rpmb
这个分区读写提供了签名和校验机制,可以保证数据安全,一般用来存放指纹、支付、交易、密钥等安全信息。
通用硬件分区
在Linux下显示为/dev/mmcblk1gp0、/dev/mmcblk1gp1、/dev/mmcblk1gp2、/dev/mmcblk1gp3
这部分分区在eMMC出厂时是没有的,用户可以自己设定,最多可以有四个通用硬件分区,每个分区容量都可以自由设定。
特别注意:通用硬件分区一旦设定便不可修改,芯片只有一次机会写入分区信息
正点原子的固件没有这几个分区,大多厂商也不用这几个分区。
UDA分区
在Linux下显示为/dev/mmcblk1
UDA分区的容量不可设置,eMMC中去掉前面所有的分区,剩下的容量就是UDA分区容量。
用户可以对UDA分区进一步划分分区,进而得到/dev/mmcblk1p1、/dev/mmcblk1p2等,可以用来存储内核、设备树、rootfs等内容
如下是正点原子的出厂固件烧录脚本(eMMC)节选:
【正点原子】阿尔法Linux开发板(A盘)-基础资料\5、开发工具\4、正点原子MFG_TOOL出厂固件烧录工具\mfgtool\Profiles\Linux\OS Firmware\ucl2.xml
- <!-- create partition -->
- <CMD state="Updater" type="push" body="send" file="mksdcard.sh.tar">Sending partition shell</CMD>
- <CMD state="Updater" type="push" body="$ tar -xf $FILE "> Partitioning...</CMD>
- <CMD state="Updater" type="push" body="$ sh mksdcard.sh /dev/mmcblk1"> Partitioning...</CMD>
复制代码 mksdcard.sh:
- #!/bin/sh
- # partition size in MB
- BOOT_ROM_SIZE=10
- # wait for the SD/MMC device node ready
- while [ ! -e $1 ]
- do
- sleep 1
- echo “wait for $1 appear”
- done
- # call sfdisk to create partition table
- # destroy the partition table
- node=$1
- dd if=/dev/zero of=${node} bs=1024 count=1
- sfdisk --force ${node} << EOF
- ${BOOT_ROM_SIZE}M,128M,c
- 138M,,83
- write
- EOF
复制代码 这个脚本将eMMC的UDA分区进一步分成了两个分区:0~10M:保留10M空间作为BOOT ROM使用,空闲没用(u-boot.imx镜像本身已经放到BOOT分区里面了,不在这里,但u-boot环境变量会落在这部分空间内)
10M~138M:容量为128M,在Linux下显示为/dev/mmcblk1p1,后面会格式化为FAT32使用,主要用来存放内核zImage镜像、各种设备树dtb镜像、启动Logo等内容
138M~结束:容量为剩余所有空间(大概好几个G),在Linux下显示为/dev/mmcblk1p2,后面会格式化为ext4分区,作为rootfs使用。
|
|