1. 问题现象与背景分析
最近在调试一块基于Xilinx ZynqMP ZU3EG核心板的嵌入式系统时,遇到了一个典型的启动故障:当使用PetaLinux构建的镜像启动时,内核加载到最后阶段突然报错"Kernel panic - No working init found"并死机。这种情况在嵌入式Linux开发中并不少见,但每次遇到都让人头疼。
具体现象是:系统能够正常加载U-Boot,也能顺利启动内核,但在内核尝试挂载根文件系统并执行init程序时失败。控制台输出的完整错误信息如下:
code复制[ 1.456789] VFS: Cannot open root device "mmcblk0p2" or unknown-block(0,0): error -2
[ 1.465432] Please append a correct "root=" boot option; here are the available partitions:
[ 1.474567] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
[ 1.483210] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.10.0-xilinx-v2021.1 #1
[ 1.490123] Hardware name: xlnx,zynqmp (DT)
2. 根本原因深度解析
2.1 ZynqMP存储控制器架构
要理解这个问题的本质,我们需要先了解ZynqMP芯片的存储控制器架构。ZynqMP系列SoC通常配备两个MMC/SD控制器:
- MMC0 (ff160000.mmc):设备号0,通常连接板载eMMC
- MMC1 (ff170000.mmc):设备号1,通常连接外部SD卡槽
在硬件设计时,工程师会根据实际需求选择使用哪个控制器连接存储设备。但PetaLinux工具链默认生成的启动参数(bootargs)中,根文件系统位置(root=)通常设置为/dev/mmcblk0p2,即假设用户使用的是MMC0控制器。
2.2 问题发生的完整链条
当出现"K
