我正在学习linux内核启动过程并尝试在我的beagleboard xM上安装linux。我在使用SD卡时遇到了两种方法。 1.将MLO,initrd,uboot.bin和uImage放在一个分区中。 2.在一个分区中使用MLO,uboot.bin和uImage,在第二个分区中使用预先构建的rootfs(Angstrom)。
在第一种方法中,如何将initrd转换为第二个分区上的完整文件系统。当uboot从uImage中提取内核并将其粘贴到第二个分区时,内部会发生什么。哪些目录将被修改为init rootfs。如何调用内核的init进程。
答案 0 :(得分:5)
一般来说,Beagleboard-XM中的启动顺序是这样的:
固件 - > MLO - > uboot.bin - > uImage - > initrd(可选) - >根文件系统
initrd本身是一个简单的基于RAM的文件系统。它通常用于挂载实际的文件系统。安装rootfs所需的一些模块捆绑到initrd中。挂载rootfs后,将清除initramfs。如果挂载rootfs所需的功能内置于内核(uImage)本身,那么就不需要initrd。正如我之前所说,initrd是一个简单的基于RAM的文件系统。这意味着如果您将此作为文件系统使用,则不会保留您在其上写入的任何内容。一些嵌入式应用程序实际上将其用作rootfs。
现在回答你的问题,
最初,u-boot将内核(uImage),initrd加载到RAM上,并将适当的命令行参数传递给内核。一旦u-boot将控制转移到内核,它首先初始化驱动程序和其他模块,最后查找initrd。 initrd通常作为cpio映像。然后内核解压缩并查找'init'。 init处理很少的东西,然后挂载rootfs。在initrd中没有第二分区这样的东西。它驻留在RAM上。
同样,在涉及到uImage时,没有第二个分区这样的东西。 uImage是u-boot理解的格式。 u-boot首先将uImage加载到RAM中,然后在实际将控制权传递给内核之前,它从uImage中提取内容,将二进制文件移动到RAM中的预定义位置,然后将控制权传递给内核。与initrd类似,内核也驻留在RAM本身上。
没有目录得到修改。但是,是的,其中一些已经安装,如procfs,sysfs等。
请参考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
二进制文件。如果找不到,内核会发生恐慌!
希望这会有所帮助。