这可能是操作系统特定的,我不知道(我正在Linux上工作)。 当BIOS将引导加载程序带入内存并且CPU开始执行时,它如何find操作系统? 它存储在一个特殊的磁盘分区/知名部门等? 如果存储在文件系统中,则引导加载程序需要与存储在OS中的文件系统代码进行交互。 鸡蛋问题如何解决?
引导程序分为几个部分。 首先,BIOS获取一些与特殊格式(称为MBR( 主引导记录 ))匹配的代码。 记住你的旧电脑:你必须告诉BIOS以什么顺序浏览一些设备来寻找MBR。 一旦发现MBR(MBR是512字节长,以幻数0x55aa
),它将复制这段代码到给定的物理内存偏移量(x86上的0x7c00
),并将指令指针设置为这个地址。 大多数情况下,一个MBR包含一个分区表,并会从设备加载一些额外的代码,这将有助于加载实际的系统:这被称为链加载 或多阶段加载 。
让我们来阐述最后一点。 请记住,系统在实时模式下正在运行,因此您只能访问1MB的物理内存,但另一方面,您可以通过BIOS中断调用轻松访问硬盘。 现在,操作系统要求的内存要比1MB多得多,为了能够访问完整的地址空间(4GB,至少在32位系统上),他们需要将处理器切换到保护模式 。 但是,一旦系统处于保护模式 , BIOS中断呼叫不再可用,并且HDD的输入/输出必须经过诸如DMA之类的复杂设置通信,并且该设置通常不会进入引导加载程序。 引导加载程序将从实模式切换到保护模式 。 它从HDD中取出一个扇区到1MB的地址空间,然后切换到保护模式,把这个扇区复制到4GB的地址空间,最后它切换回实模式,从另一个扇区硬盘。 一旦所有扇区被提取并复制到物理内存,引导加载程序就跳转到操作系统。
总结一下:
multiboot
规范来定位操作系统。 查看下面的链接,了解有关multiboot
更多信息。 你可能想看看这些资源:
BootPrompt HOWTO与你的问题有关。 BIOS包含用于加载引导磁盘第一个扇区的代码(在FlashROM中) 第一个扇区包含一个引导装载程序,如GRUB(或LILO)。 GRUB将内核加载到RAM中(带有一些initrd)。
BIOS设置保存在一个小的(电池节省的)专用RAM中。
今天的GRUB是一个相当复杂的程序。 它了解磁盘分区和常见文件系统的结构。 它能够读取其配置文件,并从分区读取内核(在该文件中配置)。 它也能够加载initrd (包含必要的内核模块)。