内核是如何加载的?

Spr*_*dzy 6 linux grub kernel linux-kernel

我试图了解 Linux 启动过程,在阅读了相当多的文档后,有一点我似乎仍然无法理解。

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

使用看起来像这样的 grub conf

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 
Run Code Online (Sandbox Code Playgroud)

因此,根据我对文档 + 我阅读的帖子的理解,将加载内核 + 将 initramfs 挂载为根文件系统。然后 init 将被执行,它将负责做一堆各种各样的事情来启动和运行系统。

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

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

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

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

von*_*and 2

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

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

  • @Spredzy 它不会像 Linux 内核那样安装它。是的,它可以访问它,但是您所认为的“挂载”是为必须处理并发访问的操作系统保留的。由于 grub 是当时唯一访问文件系统的东西,所以要简单得多。 (2认同)