PC 引导程序(Bootstrap)
本节目的
PC 物理地址空间
以 4GB 地址空间为例
对于16-bit的处理器,能够访问1MB(20-bit)(0x00000000-0x000FFFFF)的地址空间,这是为什么呢?
首先明确16-bit和20-bit分别代表寄存器的位数和CPU地址线个数。地址线才真正决定了CPU能够访问的内存范围。
那16位的寄存器如何代表20位地址线的呢?
虽然现代内存管理技术是通过分页(page),但以前是分段内存管理技术。$访问地址 = 段基址 \times 16 + 偏移地址$。段基址由段寄存器提供,偏移地址由通用寄存器或指针寄存器提供
只有低640KB(RAM)可以被用户访问,其他的384KB(ROM)作为固定设计使用:
- 0x000A0000-0x000C0000: VGA display
- 0x000F0000-0x00100000(64KB): BIOS,负责基础系统初始化,例开启显卡、检测挂载的内存大小。初始化后BIOS从合适的位置(软盘、硬盘、CD-ROM、网络)加载操作系统,并将机器的控制权交给OS。
The ROM BIOS
打开两个terminal都 cd
到 lab
目录。先在一个窗口运行 make qemu-gdb
,此时处理器会在执行第一条Instruction之前停止,等待来自gdb的连接。而后再另一个窗口运行 make gdb
接下来terminal窗口显示处理器将执行的第一条语句:
[f000:fff0] 0xffff0: ljmp $0xf000,$0xe05b
实模式下,访问地址计算为:$0xffff0 = 0xf000 \times 16 + 0xfff0$。另
ljmp(long jump)
是地址跳转指令。可以看到第一条指令是访问0xffff0,所以通过跳转指令跳到低地址。(实模式 v.s. 保护模式)
当BIOS初始化一些重要的设备之后,就会从合适的设备中加载 boot loader
程序,并且把机器的控制权给它。
Exercise2: 使用GDB的si指令跟踪BIOS的指令并尝试着理解它们