emmc 出场默认就几个分区,硬件隔离的
比如写uboot,有时候就需要写道mmc dev 0 1 中,设备0 的分区1中。

虽然能切换到MMC设备0的分区1、分区3等,但执行mmc part仍提示Unknown partition table type 0,这说明设备存在底层的分区标识(硬件/固件层面),但没有标准的分区表(如MBR/GPT),所以U-Boot无法识别和列出分区信息。

现象背后的原因解析

我们先拆解这个看似矛盾的现象:

  1. 能切换到分区#1、#3的原因
    MMC(尤其是eMMC)设备有硬件分区的概念(区别于我们常说的软件分区),包括:

    • 用户分区(User Area):就是你之前擦除的主存储区域(29 GiB),通常对应partition #0
    • 启动分区(Boot Partition):分为Boot1、Boot2,用于存储启动镜像,通常对应partition #1partition #2
    • RPMB分区:用于安全数据存储,通常对应partition #3
      这些分区是设备出厂时就固化在硬件/固件中的,所以即使你擦除了用户分区的内容,依然能通过mmc dev 0 [分区号]切换到这些硬件分区,U-Boot也会提示switch to partitions #X, OK
  2. mmc part提示无分区表的原因
    mmc part命令的作用是读取软件分区表(如MBR、GPT),这种分区表是我们后期在用户分区上创建的(比如划分boot、rootfs分区)。你之前执行了全设备擦除,已经把用户分区上的软件分区表清除了,所以mmc part无法识别,提示Unknown partition table type 0
    简单来说:你切换的是硬件分区,而mmc part查的是软件分区表,二者不是一个概念

补充:不同分区号对应的eMMC硬件分区(通用规则)

结合你的操作和eMMC的标准规范,分区号对应的硬件分区通常是这样的:

分区号 对应eMMC硬件分区 用途
0 User Area(用户分区) 主存储区域(你的29 GiB空间)
1 Boot Partition 1(启动分区1) 存储启动镜像(通常几MB,如你之前看到的Boot Capacity: 4 MiB
2 Boot Partition 2(启动分区2) 备用启动分区
3 RPMB Partition 安全存储分区(如加密数据,RPMB Capacity: 4 MiB

关键操作建议

  1. 区分硬件分区和软件分区
    • 如果你要使用主存储区域(29 GiB),切换到mmc dev 0 0即可,这是日常操作的主要分区。
    • 如果你要烧录启动镜像到eMMC的启动分区,可切换到mmc dev 0 1(Boot1),再执行mmc write命令。
  2. 无需纠结mmc part的提示
    因为这个命令只针对软件分区表,而你当前的需求(擦除、写入数据)主要在硬件分区上操作,不需要创建软件分区表也能正常执行块级读写。
  3. 查看各硬件分区的信息
    你可以切换到不同的硬件分区后,执行mmc info,查看该分区的容量、块大小等信息(比如Boot1分区只有4 MiB):
    1
    2
    3
    4
    # 切换到Boot1分区(partition #1)
    mmc dev 0 1
    # 查看该分区的信息
    mmc info

总结

  1. 能切换到分区1、3是因为eMMC的硬件分区(出厂固化) 存在,而mmc part提示无分区表是因为软件分区表(MBR/GPT) 被擦除了,二者不冲突。
  2. eMMC的分区0是主存储的用户分区(29 GiB),分区1/2是启动分区,分区3是RPMB安全分区。
  3. 日常的擦除、写入操作优先使用分区0(用户分区),烧录启动镜像可使用分区1(Boot1),无需创建软件分区表也能正常操作。

问题 :

你想知道MMC设备的多个分区的地址(块地址)是否是重新开始计数的,答案要分eMMC硬件分区软件分区(MBR/GPT分区) 两种情况,二者的块地址计数规则完全不同,我会分别给你讲清楚。

一、eMMC硬件分区(你当前操作的分区0/1/3):块地址各自独立,重新开始计数

eMMC的硬件分区(用户分区0、启动分区1、RPMB分区3等)是物理上相互独立的存储区域,每个分区的块地址都是从0开始重新计数的。

具体说明

  1. 用户分区(partition #0):块地址从0开始(0、1、2…61850623,对应29 GiB容量)。
  2. 启动分区1(partition #1):块地址也从0开始(0、1、2…8191,对应4 MiB容量)。
  3. RPMB分区(partition #3):块地址同样从0开始(0、1、2…8191,对应4 MiB容量)。

举例验证

  • 当你执行mmc dev 0 0(用户分区0)后,执行mmc write 0xa1000000 0 100,是写入用户分区0的块0~99
  • 当你执行mmc dev 0 1(启动分区1)后,执行mmc write 0xa1000000 0 100,是写入启动分区1的块0~99
  • 这两个块0是完全不同的物理地址,互不干扰。

这也是为什么你在启动分区1中写入块0,不会影响用户分区0的块0数据的原因。

二、软件分区(MBR/GPT分区,在用户分区内创建):块地址连续计数,不重新开始

如果你在eMMC的用户分区(partition #0)上创建软件分区(比如通过Linux的fdisk划分boot、rootfs、data分区),这些软件分区的块地址是基于用户分区的总块地址连续计数的,不会重新开始。

具体说明

假设用户分区0的总块地址是0~61850623,创建的软件分区如下:

软件分区 起始块地址 结束块地址 说明
boot分区 2048 104447 从用户分区的2048块开始,不是从0开始
rootfs分区 104448 2152447 接在boot分区之后,连续计数
data分区 2152448 61850623 接在rootfs分区之后

关键特点

  1. 软件分区的起始块地址是偏移量(比如2048),不是从0开始,因为用户分区的前2048块通常用于存储分区表(MBR/GPT)。
  2. 所有软件分区的块地址都属于用户分区0的块地址范围,是连续的,不存在“重新开始”的情况。

补充:如何快速区分两种分区的地址规则

分区类型 块地址计数规则 识别方式
eMMC硬件分区 各自从0开始 通过mmc dev 0 1/mmc dev 0 3切换,分区号通常是0、1、2、3(出厂固化)
软件分区(MBR/GPT) 连续计数(从偏移量开始) 通过mmc part查看(需先创建分区表),分区索引通常是1、2、3(用户创建)

总结

  1. eMMC硬件分区(0/1/3):每个分区的块地址各自独立,从0重新开始计数(这是你当前操作的分区的规则)。
  2. 软件分区(MBR/GPT):在用户分区内创建,块地址连续计数,从指定偏移量开始,不重新计数
  3. 当前遇到的启动分区1(partition #1)属于硬件分区,其块0和用户分区0的块0是不同的物理地址,互不干扰。

问题:

想知道在U-Boot中执行mmc write命令时,数据具体会被写入到MMC设备的哪个物理位置,以及不同场景下应该写入到哪个分区/块地址,我会结合你之前的操作场景,分情况讲清楚写入的目标位置和对应逻辑。

一、mmc write的写入位置核心逻辑

mmc write命令的写入位置由两个关键因素决定:

  1. 当前选中的MMC设备+分区(通过mmc dev [dev] [part]设置)。
  2. 命令中指定的blk#(起始块地址)和cnt(块数)

简单公式:
最终写入位置 = 当前选中的分区的物理存储区域 + 起始块地址(blk#)开始的cnt个块

二、不同场景下的写入位置(结合你的操作)

场景1:选中mmc dev 0 0(eMMC用户分区,主存储区)

  • 写入的物理位置:eMMC的用户分区(User Area)(也就是你看到的29 GiB主存储区)的blk#个块开始的区域。
    • 比如你执行mmc write 0xa1000000 0 1382,数据会写入用户分区的块0 ~ 块1381(物理上是eMMC主存储的最起始位置)。
  • 适用场景:写入系统镜像、根文件系统、普通数据等(因为容量大,是主要的存储区域)。

场景2:选中mmc dev 0 1(eMMC启动分区1,Boot1)

  • 写入的物理位置:eMMC的启动分区1(Boot Partition 1)(出厂固化的小分区,比如4 MiB)的blk#个块开始的区域。
    • 比如你执行mmc write 0xa1000000 0 1382,数据会写入启动分区1的块0 ~ 块1381(和用户分区的块0是完全不同的物理位置)。
  • 适用场景:写入启动镜像(如U-Boot、Bootloader),让设备从专用启动分区启动(更稳定,不易被误擦除)。

场景3:选中mmc dev 0 3(eMMC RPMB分区)

  • 写入的物理位置:eMMC的RPMB分区(Replay Protected Memory Block)(安全存储分区,4 MiB)的blk#个块开始的区域。
  • 适用场景:写入加密数据、设备密钥等需要安全保护的内容(一般开发中很少用到)。

三、如何确认你当前写入的位置?(实操步骤)

你可以通过以下命令快速确认mmc write的目标位置,避免写入错误区域:

1
2
3
4
5
6
7
8
# 1. 查看当前选中的设备和分区(核心:确认是0 0、0 1还是0 3)
mmc dev

# 2. 查看当前分区的详细信息(确认该分区的容量、块大小,避免超出上限)
mmc info

# 3. 执行写入命令(明确起始块和块数)
mmc write 0xa1000000 0 1382

四、补充:软件分区(MBR/GPT)的写入位置

如果后续你在用户分区(mmc dev 0 0)上创建了软件分区(如boot、rootfs分区),写入位置会是:

  • 比如软件boot分区的起始块是2048,执行mmc write 0xa1000000 2048 102400,数据会写入用户分区的块2048 ~ 块104447(对应软件boot分区的区域)。
  • 这种情况下,写入位置依然是用户分区的物理块,只是对应到了软件分区的逻辑地址。

总结

  1. U-Boot中mmc write的写入位置由当前选中的MMC分区命令中的起始块地址共同决定。
  2. 你常用的mmc dev 0 0是写入eMMC主存储的用户分区(29 GiB),mmc dev 0 1是写入专用的启动分区1(4 MiB),二者的块地址相互独立。
  3. 写入前务必用mmc dev确认当前分区,用mmc info确认分区容量,避免超出块数上限导致写入失败。