从uboot到kernel:eMMC分区信息在系统启动各阶段的查看与对比(以i.MX6ULL为例) 从uboot到kerneleMMC分区信息在系统启动各阶段的查看与对比以i.MX6ULL为例嵌入式系统启动过程中存储设备的分区信息如同城市的地图在不同阶段呈现出截然不同的视角。当我们以i.MX6ULL平台为例从uboot到kernel完整跟踪eMMC分区的演变过程时会发现这不仅是技术实现的差异更反映了系统初始化过程中存储管理机制的深刻变迁。1. uboot阶段的eMMC分区视图原始布局的探照灯在i.MX6ULL平台上uboot对eMMC的访问就像考古学家用探照灯照射古代遗址——只能看到最基础的结构轮廓。通过mmc part命令我们获取的是存储在eMMC硬件中的原始分区表信息u-boot mmc part Partition Map for MMC device 2 -- Partition Type: DOS Part Start Sector Num Sectors UUID Type 1 16384 131072 3bb27e95-01 0c 2 1835008 28942336 3bb27e95-02 83 3 147456 98304 3bb27e95-03 83 4 245760 1589248 3bb27e95-04 0f Extd 5 245762 16382 3bb27e95-05 83 6 262146 1572862 3bb27e95-06 83这个阶段的视图特点包括物理扇区视角所有分区信息都以绝对扇区号表示直接对应eMMC存储介质的物理布局分区表原始格式显示的是存储在设备上的分区表原始数据结构本例为DOS/MBR格式无挂载概念此时文件系统尚未初始化分区只是存储空间的划分标记注意不同uboot版本可能支持不同的分区查看命令如part list mmc 0等但核心信息呈现方式类似。在调试uboot阶段存储问题时有几个关键验证点需要特别关注启动分区是否可读使用mmc read测试关键分区数据读取分区对齐检查确认分区起始位置符合eMMC擦除块大小要求分区类型标识确保bootloader能正确识别Linux文件系统分区2. kernel初始化早期的dmesg视图设备树的动态构建当内核开始接管硬件控制权时dmesg日志呈现的eMMC分区信息就像施工队手中的蓝图——展示了系统如何将原始存储空间转化为可用的块设备[ 1.382746] mmc2: new HS200 MMC card at address 0001 [ 1.388573] mmcblk2: mmc2:0001 004GA0 3.64 GiB [ 1.393487] mmcblk2boot0: mmc2:0001 004GA0 partition 1 4.00 MiB [ 1.399824] mmcblk2boot1: mmc2:0001 004GA0 partition 2 4.00 MiB [ 1.406543] mmcblk2: p1 p2 p3 p4 p5 p6 这个转换过程包含几个关键技术环节块设备节点创建内核为每个物理分区生成对应的设备节点如mmcblk2p1分区属性解析从设备树或分区表中获取分区大小、类型等元数据特殊分区处理如boot0/boot1等硬件分区被单独识别与uboot阶段相比内核的视角已经发生了重要变化对比维度uboot视图kernel早期视图分区标识扇区范围设备节点名(mmblkXpY)访问方式原始扇区读写块设备接口扩展分区处理显示扩展分区结构展平为连续编号的分区特殊分区可能无法识别明确识别boot分区等在调试启动失败问题时这个阶段的日志特别有价值。例如当看到分区识别成功但挂载失败时问题可能出在文件系统驱动未编译进内核分区中的文件系统已损坏内核配置与实际分区格式不匹配3. 用户态工具视角运行时存储拓扑的全景图系统完全启动后我们通过多种用户态工具获得的eMMC分区信息就像城市规划局的立体沙盘——展示了存储设备在运行时的完整拓扑结构。以下是几种典型工具的对比分析3.1 /proc/partitions 的简洁列表cat /proc/partitions major minor #blocks name 179 0 15388672 mmcblk2 179 1 65536 mmcblk2p1 179 2 14471168 mmcblk2p2 179 3 49152 mmcblk2p3 179 4 1 mmcblk2p4 179 5 8191 mmcblk2p5 179 6 786431 mmcblk2p6这个视图的特点是按主次设备号组织的设备列表显示每个分区以512字节为单位的块数不包含分区类型、UUID等详细信息3.2 lsblk的树状展示lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT mmcblk2 179:0 0 14.7G 0 disk ├─mmcblk2p1 179:1 0 64M 0 part /run/media/mmcblk2p1 ├─mmcblk2p2 179:2 0 13.8G 0 part / ├─mmcblk2p3 179:3 0 48M 0 part ├─mmcblk2p4 179:4 0 1K 0 part ├─mmcblk2p5 179:5 0 8M 0 part /run/media/mmcblk2p5 └─mmcblk2p6 179:6 0 768M 0 part /cachelsblk的优势在于直观的树状结构展示设备/分区关系包含挂载点信息显示人类可读的容量单位3.3 fdisk的专业分区表分析fdisk -l /dev/mmcblk2 Disk /dev/mmcblk2: 14.69 GiB, 15758000128 bytes, 30777344 sectors Units: sectors of 1 * 512 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x3bb27e95 Device Boot Start End Sectors Size Id Type /dev/mmcblk2p1 16384 147455 131072 64M c W95 FAT32 (LBA) /dev/mmcblk2p2 1835008 30777343 28942336 13.8G 83 Linux /dev/mmcblk2p3 147456 245759 98304 48M 83 Linux /dev/mmcblk2p4 245760 1835007 1589248 776M f W95 Extd (LBA) /dev/mmcblk2p5 245762 262143 16382 8M 83 Linux /dev/mmcblk2p6 262146 1835007 1572862 768M 83 Linuxfdisk提供了最接近uboot视角的专业信息包括精确的扇区级分区布局分区类型标识符启动标志状态分区表类型MBR/GPT4. 全流程对比分析与调试实践将三个阶段的eMMC分区信息放在一起对比就像用不同时代的卫星图像观察同一片区域的地貌变迁。下表总结了关键差异特征点uboot阶段kernel早期用户态阶段信息源原始分区表内核块设备子系统虚拟文件系统接口分区标识扇区范围mmcblkXpY多种命名方式扩展分区显示扩展结构展平为线性分区取决于工具访问方式直接硬件命令设备节点高级工具接口典型应用场景刷机、低级修复驱动调试日常管理在实际调试中这种多阶段视角特别有助于定位以下类型的问题案例1内核无法挂载根文件系统排查步骤在uboot中使用mmc part确认分区表存在且可读检查dmesg确认内核是否正确识别了分区对比uboot和fdisk显示的分区起始位置是否一致使用hexdump检查分区头部文件系统签名案例2系统升级后分区错位解决方案在uboot中备份原始分区表使用mmc write修复错误的分区表通过内核参数指定根分区位置最终更新bootloader环境变量案例3eMMC寿命预警监控方法在uboot阶段检查eMMC扩展寄存器获取健康状态内核启动后通过sysfs接口监控坏块统计用户态使用smartmontools进行定期检测掌握这些多阶段的分析方法开发者就能像拥有时间望远镜一样穿透系统启动的各个阶段准确诊断存储相关的各种疑难杂症。