启动时,Linux内核是先加载到内存还是先挂载根文件系统?我有这个疑问是因为压缩的内核映像通常位于 /boot/vmlinuz。因此,要访问内核映像,应该挂载根文件系统。但是由于根文件系统将驻留在存储中,如何从存储中读取它呢?
1 回答
Linux Kernel first loaded to the memory or the first the root file system is mounted?
首先,BIOS 加载引导加载程序 (assumimg GRUB),利用其内置例程从磁盘的初始 512 字节访问MBR
磁盘并执行它。代码被加载到 RAM 中并执行,这不需要任何文件系统理解,理想情况下它是 RAW 代码。在下一阶段,引导加载程序加载/boot/grub/grub.cfg
文件并传递内容以供执行。下面是我的 Linux GRUB 配置,
menuentry 'Ubuntu, with Linux 3.5.0-37-generic' --class ubuntu --class gnu-linux
--class gnu --class os {
...
search --no-floppy --fs-uuid --set=root 925c0ccb-1532-4078-bee0-07acff8bc917
linux /vmlinuz-3.5.0-37-generic root=/dev/mapper/my_vg-root ro quiet
splash $vt_handoff
initrd /initrd.img-3.5.0-37-generic
}
Figure: 1
Linux:/boot/grub$ sudo blkid -U 925c0ccb-1532-4078-bee0-07acff8bc917
/dev/sda1
Linux:/boot/grub$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/my_vg-root 455G 126G 307G 29% /
udev 1.8G 4.0K 1.8G 1% /dev
tmpfs 708M 980K 707M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 1.8G 408K 1.8G 1% /run/shm
/dev/sda1 228M 131M 85M 61% /boot
从上图: 1,引导加载程序搜索一个块ID号925c0ccb-1532-4078-bee0-07acff8bc917
,这是我的引导设备/dev/sda1
并安装到/boot
如图所示。因此,在这个最后阶段,GRUB 加载 Linux 内核和 initrd 映像,使用 BIOS 磁盘实用程序在块设备下查找/boot
到 RAM。通常 BIOS 在处理器的实模式下运行,它只能处理2^20
限制为 ~1MB 的 RAM 字节。现在内核和 initrd 重量超过 1MB,将它们加载到 RAM 第一个内核到 1MB,跳转到保护模式并将加载的内核传递到高内存并释放实模式的前 1MB。一旦内核正在运行并且加载到 RAM 中的 initramfs 将找到它本身所在的文件系统的位置,并将其作为其根/
文件系统传递给内核。
阅读Tim Jones文章以了解更多信息。