linaro移植参考博文: http://blog.csdn.net/yake827/article/details/52036703
参考网上某博文上的方法在zynq平台移植了单用户模式的linaro系统(无桌面输出),但系统启动时出现了如题所示的问题,并且启动卡在了“---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)”这行打印处,仔细查看系统制作过程和网上方法完全相同,但系统终无法启动,纠结了一两天,重新编译了无数次内核和设备树,走了无数弯路之后终于查清问题所在,现将过程记录如下,以便日后参考。
按照网上移植linaro的方法修改设备树启动参数,在arch/arm/boot/dts/zynq-zed.dtsi中将bootargs更改为:
bootargs ="console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4rootwait devtmpfs.mount=0"; 完成这一步之后,linux就应该会从SD卡的第二分区中挂载linaro根文件系统。但我按照此方法修改了zynq-zed.dtsi中的bootargs之后,出现了上述问题。
仔细查看系统启动打印信息发现有“Kernel command line: root=/dev/ram rw earlyprintk”一行信息,这行信息是设备树传递给内核的启动参数,但实际上正确的输出应该是“Kernel command line: console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait”。因为移植的linaro(EXT4类型)系统是放在SD卡的第二分区EXT中,所以这里要让root=/dev/mmcblk0p2。内核启动时打印的信息是root=/dev/ram,说明设备树没有修改成功。 利用Source Insight在内核源码中查到 root=/dev/ram rw earlyprintk 出自zynq-zed.dts文件,既然启动参数在此文件中设置,那么修改根文件系统为从第二分区启动应该也是在此处修改。
于是尝试将中zynq-zed.dts中的bootargs改为bootargs ="console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4rootwait devtmpfs.mount=0",再次制作设备树,最终成功启动了linaro文件系统。而之前按照网上方法一直以为要修改的是zynq-zed.dtsi文件,所以未能成功。
一点经验:制作设备树devicetree.dtb时直接依赖的文件应该是.dts,而不是XX.dtsi,XX.dtsi由其他文件引用(比如我所用的内核中zynq-zed.dtsi被zynq-zed-adv7511.dts引用)。 Linux系统启动时设备树将启动参数传递给内核,内核由此决定从SD卡哪个分区挂载根文件系统(当然,启动参数不仅决定了根文件系统的启动分区,还有一些其他信息)。