我有一个基于 ARM 处理器克隆、在 FPGA 上实现的定制设计的 SoC,我正尝试在其上启动 Linux(内核 3.10)。
我已成功添加对我的自定义外围设备(USART、中断控制器和计时器)的支持,这使我能够看到内核在尝试挂载根文件系统之前显示的 printk 消息。
我有一个 2GB 的自定义非易失性内存,随机访问,可读写,从地址 0 映射到 0x7FFFFFFF,引导加载程序从该地址执行,其中包含内核和文件系统分区。引导加载程序将内核复制到 RAM(256Mb,从 0x80000000 到 0x8FFFFFFF),然后将控制权传递给 Linux,Linux 在以下位置失败:“内核崩溃 - 未同步:VFS:无法在未知块 (0,0) 上挂载根文件系统”。
从我的调试和互联网搜索来看,内核似乎无法识别我的非易失性存储器,因此无法挂载文件系统。
我如何告诉内核它应该从该内存启动,以及必须将哪些代码添加到内核?例如,是否有可能让内核认为我的内存是 Nand,并修改 Nand 驱动程序以正确访问它?
提前感谢您的所有帮助和建议。
答案1
我不确定你现在对“文件系统分区”做了什么。但是你可以将 initrd 放入看起来/行为像 RAM 的非易失性存储器中,然后让你的引导加载程序告诉 Linux 使用 initrd。
大多数 initrd 都会进行一些设置,然后尝试在块设备上重新安装根文件系统。就您而言,您的 initrd 将是您的真正根文件系统,您需要将 shell 等实用程序放在 initrd 中。
当使用 U-Boot 在 ARM 上启动时,基本上启动命令将内核和 initrd 从存储设备加载到固定的 RAM 位置,然后将 initrd 的地址作为命令行参数传递给内核,指定该地址。
嗯,如果您确实需要可读/可写的块设备,MTD 驱动程序可以占用一部分 RAM(MTD 驱动程序中有一个“物理系统 RAM”选项make menuconfig
)并将其转换为块设备。例如,它可用于将显卡 RAM 安装为小型交换分区。 看到这个。
我认为执行此操作的命令是modprobe phram phram=0x00100000;256MiB
,如果您在内存位置 0x00100000 处有一个 256MByte 文件系统。然后,modprobe mtdblock
然后执行/dev/mtdblock0
。然后您可以执行类似的事情mount /dev/mtdblock0
。因此,您需要在 initrd 中执行上述操作的小脚本,然后fsck /dev/mtdblock0
,然后启动您的init
或您的进程 1。
您甚至可能能够以某种方式在内核命令行上指定所有这些,但我不确定这是否受支持。无论如何,您可能希望使用小型 initrd 以提高灵活性。