Nighpher,我将尝试回答您的问题,但是有关引导过程的更全面的描述,请尝试IBM文章。
好的,我假设您使用GRUB或GRUB2作为引导加载程序进行解释。首先,当BIOS访问磁盘以加载引导加载程序时,它将利用其内置的磁盘访问例程存储在著名的13h中断中。引导加载程序(以及设置阶段的内核)在访问磁盘时会使用这些例程。请注意,BIOS在处理器的实模式(16位)模式下运行,因此它不能寻址超过2 ^ 20字节的RAM(2 ^ 20而不是2 ^ 16),因为实模式下的每个地址都由segment_address * 16 + offset组成,其中段地址和偏移量均为16位,请参见http://en.wikipedia.org/wiki/X86_memory_segmentation)。因此,这些例程不能访问超过1 MiB的RAM,这是一个严格的限制,并且带来了很大的不便。
BIOS直接从MBR加载引导加载程序代码-磁盘的前512个字节并执行它。如果使用的是GRUB,则该代码为GRUB阶段1。该代码将加载GRUB阶段1.5,该阶段位于磁盘空间的前32 KiB(称为DOS兼容性区域)中,或者位于文件系统的固定地址中。它不需要了解文件系统就可以做到这一点,甚至是在文件系统中处于阶段1.5时,它也是“原始”代码,可以直接加载到RAM中并执行:http : //www.pixelbeat.org/ docs / disk /。从磁盘到RAM的stage1.5负载使用BIOS磁盘访问例程。
Stage1.5包含文件系统实用程序,因此它可以从文件系统读取stage2(好吧,它仍然使用BIOS 13h从磁盘读取到RAM,但是现在它可以解密有关inode等的文件系统信息,并从文件中获取原始代码。磁盘)。由于磁盘寻址方式的限制,较早的BIOS可能无法访问整个HD-它们可能使用Cylinder-Head-Sector系统,无法寻址超过前8 GiB的磁盘空间:http://en.wikipedia。 org / wiki / Cylinder-head-sector。
Stage2 将内核加载到RAM中(再次使用BIOS磁盘实用程序)。如果是2.6+内核,则还可以在其中编译initramfs,因此无需加载它。如果是较旧的内核,则引导加载程序还会将独立的initrd映像加载到内存中,以便内核可以挂载它并获取用于从磁盘挂载实际文件系统的驱动程序。
问题是内核(和ramdisk)的重量超过1 MiB,因此要将它们加载到RAM中,您必须先将内核加载到1 MiB,然后跳转到保护模式(32位),将加载的内核移至高内存(空闲)。前1个MiB(用于实模式),然后再次返回实(16位)模式,将虚拟磁盘从磁盘获取到前1个MiB(如果它是单独的initrd和更早的内核),可能再次切换到保护(32位)模式,将其放置在其所属位置,可能会返回到实模式(或不返回实模式):https : //stackoverflow.com/questions/4821911/does-grub-switch-to-protected-mode)并执行内核代码。警告:我不确定这部分说明的详尽性和准确性。
现在,当您最终运行内核时,您已经将它和ramdisk通过bootloader加载到RAM中,因此内核可以使用ramdisk中的磁盘实用程序来安装真正的根文件系统并将根旋转到它。ramfs驱动程序存在于内核中,因此它当然可以理解initramfs的内容。