Linux内核启动方法预先构建的rootfs

时间:2014-07-28 04:41:54

标签: linux-kernel embedded-linux boot bootloader

我正在学习linux内核启动过程并尝试在我的beagleboard xM上安装linux。我在使用SD卡时遇到了两种方法。  1.将MLO,initrd,uboot.bin和uImage放在一个分区中。  2.在一个分区中使用MLO,uboot.bin和uImage,在第二个分区中使用预先构建的rootfs(Angstrom)。

在第一种方法中,如何将initrd转换为第二个分区上的完整文件系统。当uboot从uImage中提取内核并将其粘贴到第二个分区时,内部会发生什么。哪些目录将被修改为init rootfs。如何调用内核的init进程。

1 个答案:

答案 0 :(得分:5)

一般来说,Beagleboard-XM中的启动顺序是这样的:

固件 - > MLO - > uboot.bin - > uImage - > initrd(可选) - >根文件系统

initrd本身是一个简单的基于RAM的文件系统。它通常用于挂载实际的文件系统。安装rootfs所需的一些模块捆绑到initrd中。挂载rootfs后,将清除initramfs。如果挂载rootfs所需的功能内置于内核(uImage)本身,那么就不需要initrd。正如我之前所说,initrd是一个简单的基于RAM的文件系统。这意味着如果您将此作为文件系统使用,则不会保留您在其上写入的任何内容。一些嵌入式应用程序实际上将其用作rootfs。

现在回答你的问题,

如何在第二个分区上将initrd转换为完整的文件系统?

最初,u-boot将内核(uImage),initrd加载到RAM上,并将适当的命令行参数传递给内核。一旦u-boot将控制转移到内核,它首先初始化驱动程序和其他模块,最后查找initrd。 initrd通常作为cpio映像。然后内核解压缩并查找'init'。 init处理很少的东西,然后挂载rootfs。在initrd中没有第二分区这样的东西。它驻留在RAM上。

当uboot从uImage中提取内核并将其粘贴到第二个分区时,内部会发生什么?

同样,在涉及到uImage时,没有第二个分区这样的东西。 uImage是u-boot理解的格式。 u-boot首先将uImage加载到RAM中,然后在实际将控制权传递给内核之前,它从uImage中提取内容,将二进制文件移动到RAM中的预定义位置,然后将控制权传递给内核。与initrd类似,内核也驻留在RAM本身上。

哪些目录会被修改为init rootfs?

没有目录得到修改。但是,是的,其中一些已经安装,如procfs,sysfs等。

如何调用内核的init进程?

请参考init / main.c下的kernel_init()函数,了解内核如何执行init(参考http://lxr.free-electrons.com/source/init/main.c#L871)。

我正在附加一个简单的代码片段:

if (!try_to_run_init_process("/sbin/init") ||
    !try_to_run_init_process("/etc/init") ||
    !try_to_run_init_process("/bin/init") ||
    !try_to_run_init_process("/bin/sh"))
    return 0;

panic("No working init found.  Try passing init= option to kernel. "
      "See Linux Documentation/init.txt for guidance.");

因此,内核在这些默认路径中搜索init二进制文件。如果找不到,内核会发生恐慌!

希望这会有所帮助。