当 x86 CPU 电源联通后,它的 EIP (The Instruction Pointer) 被硬编码到地址 0xFFFFFFF0
,即内存的最后 16 位。这时 CPU 是处于实模式 (Real Mode) 的,所以相当于从 0xFFFFFFF0
开始 CPU 可以执行一条命令。
实模式 (Real Mode) 和 保护模式 (Protected Mode) 是 CPU 的两种工作模式,实模式是早期 CPU 的工作模式,保护模式是现代 CPU 的工作模式。实模式出现在 8086 CPU 时代,运行的是 16 位指令。但 16 位 CPU 最多支持 1MB 的寻址(20 根地址线),所以后来内存越来越大后寄存器的位数就变成了 32 位。所以就引入了保护模式, 用来实现更大空间的,更灵活的内存访问 。
与实模式寻址的
segment << 4 + offset
不同,保护模式的寻址方式是通过逻辑地址 (Logical Address) 的segment:offset
中的segment
作为selector
来索引到GDT/LDT
中的一项,然后通过flags
判断当前程序是否可以访问这段内存,可以访问的话提取base
与offset
相加得到线性地址 (Linear Address),最后将线性地址通过分页表得到物理地址 (Physical Address) 。现代 CPU 在运行 BootLoader 的时候仍然要先进入实模式,这是为了实现软件的向后兼容。
0xFFFFFFF0
开始的这 16 位大小的地址被叫做 重置向量 (Reset Vector)。这时,BIOS 会将自己移动到 RAM 中,这样可以在后面的运行中有更快的访问速度,而 主板厂商会保证 0xFFFFFFF0
这个地址指向 BIOS 的地址 (通常 0xFFFFFFF0
这里就是一个 jmp
指令)。于是 BIOS 就开始运行了。
BIOS 会按照设定扫描不同的设备(硬盘,CD-ROM,Flash Drive,等等)并判断设备中是否可引导 (Bootable)。这个判断的方式通常是去 查看设备的第一个 Sector 的最后两字节(即 511 和 512 字节)是否为 0xAA55
(注意是低字节序 Little-Endian 还是高字节序 Big-Endian),是的话该设备就是可引导的。
当 BIOS 发现了可引导设备后,他就会把该可引导设备的 第一个 Sector 拷贝到 RAM 中的 0x7c00
(从 0x7c00
开始的 512 字节),并跳到 0x7c00
开始执行拷贝的程序。这一段程序通常被叫做 Bootloader。
Bootloader 于是开始从 RAM 中的 0x100000
加载系统内核。基本上所有的 x86 操作系统的内核都在 0x100000
。在这个过程中,Bootloader 或者是操作系统本身会把 CPU 的运行模式从 实模式 切换到 保护模式 。于是我们的操作系统就被启动了。
本文作者 Auther:Soptq
本文链接 Link: https://soptq.me/2020/07/22/os-boot/
版权声明 Copyright: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处。 Content on this site is licensed under the CC BY-NC-SA 4.0 license agreement unless otherwise noted. Attribution required.
发现存在错别字或者事实错误?请麻烦您点击 这里 汇报。谢谢您!