背景:Intel 80386 加电后启动过程
【要点(非 OSP):80836 物理内存地址空间】
【要点(非 OSP):80836 加电后的第一条指令位】
大家一般都知道 bootloader 负责启动操作系统,但 bootloader 自身是被谁加载并启动的呢?为了追根溯源,我们需要了解当计算机加电启动后,到底发生了什么事情。
对于绝大多数计算机系统而言,操作系统和应用软件是存放在磁盘(硬盘/软盘)、光盘、EPROM、ROM、Flash 等可在掉电后继续保存数据的存储介质上。当计算机加电后,一般不直接执行操作系统,而是一开始会到一个特定的地址开始执行指令,这个特定的地址存放了系统初始化软件,通过执行系统初始化软件(可固化在 ROM 或 Flash 中,也称 firmware,固件)完成基本 I/O 初始化和引导加载操作系统的功能。简单地说,系统初始化软件就是在操作系统内核运行之前运行的一段小软件。通过这段小软件的基本 I/O 初始化部分,我们可以初始化硬件设备、建立系统的内存空间映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。最终系统初始化软件的引导加载部分把操作系统内核映像加载到 RAM 中,并将系统控制权传递给它。
对于基于 Intel 80386 的计算机而言,其中的系统初始化软件由 BIOS (Basic Input Output System,即基本输入/输出系统,其本质是一个固化在主板 Flash/CMOS 上的软件) 和位于软盘/硬盘引导扇区中的 OS Boot Loader(在 ucore 中的 bootasm.S 和 bootmain.c)一起组成。BIOS 实际上是被固化在计算机 ROM(只读存储器)芯片上的一个特殊的软件,为上层软件提供最底层的、最直接的硬件控制与支持。
以基于 Intel 80386 的计算机为例,计算机加电后,整个物理地址空间如下图所示:
图 2-1 基于 Intel 80386 的计算机物理地址空间
处理器处于实模式状态(在 86386 中,段机制一直存在,可进一步参考 2.1.5 【背景】理解保护模式和分段机制),从物理地址 0xFFFFFFF0 开始执行。初始化状态的 CS 和 EIP 确定了处理器的初始执行地址,此时 CS 中可见部分-选择子(selector)的值为 0xF000,而其不可见部分-基地址(base)的值为 0xFFFF0000;EIP 的值是 0xFFF0,这样实际的线性地址(由于没有启动也机制,所以线性地址就是物理地址)为 CS.base+EIP=0xFFFFFFF0。在 0xFFFFFFF0 这里只是存放了一条跳转指令,通过跳转指令跳到 BIOS 例行程序起始点。更详细的解释可以参考文献[1]的第九章的 9.1 节“INITIALIZATION OVERVIEW”。另外,我们可以通过硬件模拟器 qemu 来进一步认识上述结果。
实验 2-1:通过 qemu 了解 Intel 80386 启动后的 CS 和 EIP 值,并分析第一条指令的内容
- 启动 qemu 并让其停到执行第一条指令前,这需要增加一个参数”-S” qemu –S
- 这是 qemu 会弹出一个没有任何显示内容的图形窗口,显示如下:
- 然后通过按”Ctrl+Alt+2”进入 qemu 的 monitor 界面,为了了解 80386 此时的寄存器内容,在 monitor 界面下输入命令 “info registers”
- 可获得 intel 80386 启动后执行第一条指令前的寄存器内容,如下图所示
从上图中,我们可以看到 EIP=0xfff0,CS 的 selector=0xf000,CS 的 base=0xfff0000。
BIOS 做完计算机硬件自检和初始化后,会选择一个启动设备(例如软盘、硬盘、光盘等),并且读取该设备的第一扇区(即主引导扇区或启动扇区) 到内存一个特定的地址 0x7c00 处,然后 CPU 控制权会转移到那个地址继续执行。至此 BIOS 的初始化工作做完了,进一步的工作交给了 ucore 的 bootloader;ucore 的 bootloader 会完成处理器从实模式到保护模式的转换,并从硬盘上读取并加载 ucore。其大致流程如下图所示:
图 2-2 Intel80386 启动过程
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论