关键词:eMMC boot、PARTITION_CONFIG、force_ro等。
1. eMMC的分区
大部分eMMC都有类似如下的分区,其中BOOT、RPMB和UDA一般是默认存在的,gpp分区需要手动创建。
BOOT主要是为了支持从eMMC启动系统而设计的;RPMB即Replay Protected Memory Block简称,通常用来保存安全线管的数据;GPP主要用于存储系统或者用户数据。
UDA通常会进行再分区,然后根据不同目的存放相关数据,或者格式化成不同文件系统。
2. Linux下读写boot分区
因为boot分区中一般存放的是bootloader或者相关配置参数,这些参数一般是不允许修改的,所以默认情况下是能读boot分区,不能写。
2.1 使能读写
如果需要些则需要,修改/sys/block/mmcblk0boot1/force_ro。
使能写:
echo 0 > /sys/block/mmcblk0boot1/force_ro
关闭写:
echo 1 > /sys/block/mmcblk0boot1/force_ro
在重启之后,force_ro会恢复为1。
2.2 内核force_ro实现
下面来看看force_ro是如何起作用的?
eMMC在被初始化的时候,调用mmc_blk_probe(),这里面会在每个设备下创建force_ro sysfs节点。
static int mmc_blk_probe(struct mmc_card *card)
{
...
if (mmc_add_disk(md))
goto out;
...
}
static int mmc_add_disk(struct mmc_blk_data *md)
{
int ret;
struct mmc_card *card = md->queue.card;
device_add_disk(md->parent, md->disk);
md->force_ro.show = force_ro_show;