8086 开机流程笔记
虚拟地址
地址总线 20 根,决定了处理器的寻址能力为 1MB,但是 16 位的寄存器(对应数据总线也是 16 根)决定了只凭 1 个寄存器是无法穷尽 1MB 的地址空间的,所以至少需要 2 个寄存器才能表示完整的地址空间。比如,用一个寄存器 A 存储物理地址的高 16 位,剩下的低 4 位地址用另一个 16 位寄存器表示绰绰有余,这样一来将寄存器 A 的内容左移 4 位再加上寄存器 B 的内容就可得到实际的物理地址,其中寄存器 A 的地址称为段地址,寄存器 B 的内容称为偏移地址,即实际物理地址时=段地址 * 16 + 偏移地址。「段地址:偏移地址」所表示的地址对被称为虚拟地址。由于两个 16 位寄存器表示一个 20 位的物理地址是绰绰有余,于是一个物理地址便可能有多个虚拟地址相对应,比如 0xfffff=0xffff * 16 + 0x000f=0xfff0 * 16 + 0x00ff = 0xff00 * 16 + 0x0fff。
1MB 物理地址空间分配:
- 0x00000~0x9FFFF: 10 * 2^16 = 640kB 由 RAM 提供,编程人员可自由使用
- 0xA0000~0xEFFFF: 5 * 2^16 = 320kB 对应特定的硬件设备的存储器空间,比如显存的 0xB8000~0xBFFFF:2^15 = 32KB 就在里面
- 0xF0000~0xFFFFF:1 * 2^16 = 64KB 对应 BIOS-BOM
8086 开机流程
BIOS 自检
开机流程:处理器有个名为 RESET 的引脚,用于接收复位信号,每当处理器加电或者 RESET 引脚由低电平变到高电平时,处理器都会执行硬件初始化的操作,以及一个可选的内部自测试,然后会讲所有的寄存器内容都恢复到初始状态,其中除了 CS 寄存器的初始状态为 0xFFFF,其余所有的寄存器初始状态都为 0x0000。然后处理器便从逻辑地址 0xffff:0000 即对应 0xffff0 的物理地址处开始执行它开机后的第一条指令,这个指令位于 BIOS-ROM 中,通常是一个跳转指令,跳转的地方对应 BIOS-ROM 的较低的地址,然后正式执行 BIOS 自检程序,自检程序的指令是固化在 BIOS-ROM 特定地址的,所以 0xffff0 处跳转指令对应的地址是固定,每次开机都是这样的流程。
主引导扇区
BIOS 自检程序执行完毕后,会将硬盘的第 0 面第 0 道第 1 扇区的所有内容加载到内存的 0x07c00 处当成指令开始执行(当然,前提是 BIOS 设置为从硬盘启动)。剩下的就是编程人员要考虑如何利用主引导扇区的 512B 空间和 8086 可寻址的 1MB 内存空间中除开 BIOA-ROM 之外的地址空间来完成他们的目标了。