Has*_*ell 2 boot linux-kernel embedded-linux 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进程.
一般来说,Beagleboard-XM中的启动顺序是这样的:
固件 - > MLO - > uboot.bin - > uImage - > initrd(可选) - > rootfs
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等.
请参考kernel_init()
init/main.c下的函数来了解内核如何执行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.");
Run Code Online (Sandbox Code Playgroud)
因此,内核在这些默认路径中搜索init
二进制文件.如果找不到,内核会发生恐慌!
希望这可以帮助.