![内核是如何加载的?](https://linux22.com/image/30454/%E5%86%85%E6%A0%B8%E6%98%AF%E5%A6%82%E4%BD%95%E5%8A%A0%E8%BD%BD%E7%9A%84%EF%BC%9F.png)
我正在尝试了解 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
完成/
。