内核是如何加载的?

内核是如何加载的?

我正在尝试了解 Linux 启动过程,在阅读了大量文档后,有一点我似乎仍然无法理解。

所以基本是 BIOS -> Grub MBR -> Grub CONF -> Kernel ...

grubconf 看起来像这样

title CentOS (2.6.32-358.2.1.el6.i686)
    root (hd0,0)
    kernel /vmlinuz-2.6.32-358.2.1.el6.i686 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
    initrd /initramfs-2.6.32-358.2.1.el6.i686.img 

因此,根据我对文档的理解+我阅读的帖子,内核将被加载+挂载 initramfs 作为根文件系统。然后 init 将被执行,它将负责执行一系列各种操作以使系统启动并运行。

我的问题是:内核是如何加载的?

我的意思是,由于内核位于/boot/vmlinuz-2.6.32-358.2.1.el6.i686我的设备(hd0,0)中,因此需要首先以某种方式安装文件系统,以便可以访问它。

如果(我怀疑)Grub挂载hd0,0分区,它是否首先使用initramfs执行pivot_root,然后使用实际root=fs指定为内核参数的另一个pivot_root?

欢迎任何可以帮助我更好地理解这一切是如何协同工作的解释/链接,

答案1

Grub 有自己的文件系统驱动程序。它不使用Linux。 Grub根据以下命令将内核和initrd加载到内存中Linux 内核启动协议。内核的一部分被加载到预定义的地址,Grub 设置一些参数,以便内核知道在哪里找到其余部分。

当内核启动时,它使用自己的驱动程序安装根分区(该驱动程序不能是模块,因为此时没有模块)。根分区可以是一个 initrd,一个 initramfs,或(在没有 initramfs 或 initrd 的情况下)由root命令行参数指示的块设备(如果没有root参数,则为编译的默认值)。

答案2

grub 所做的就是访问/boot(只读就足够了,grub 在这里并不需要完整的文件系统处理),并从中获取相关文件。它将内核和 initramfs 加载到内存中,并将控制权交给新加载的内核。

然后,新加载的内核init在 initramfs 中运行,最终pivot_root完成/

相关内容