The BIOS is responsible for performing basic system initialization such as activating the video card and checking the amount of memory installed.
关闭 qemu , Ctrl+a x.
PC architects nevertheless preserved the original layout for the low 1MB of physical address space in order to ensure backward compatibility with existing software.
+------------------+ <- 0xFFFFFFFF (4GB)
| 32-bit |
| memory mapped |
| devices |
| |
/\/\/\/\/\/\/\/\/\/\
/\/\/\/\/\/\/\/\/\/\
| |
| Unused |
| |
+------------------+ <- depends on amount of RAM
| |
| |
| Extended Memory |
| |
| |
+------------------+ <- 0x00100000 (1MB)
| BIOS ROM |
+------------------+ <- 0x000F0000 (960KB)
| 16-bit devices, |
| expansion ROMs |
+------------------+ <- 0x000C0000 (768KB)
| VGA Display |
+------------------+ <- 0x000A0000 (640KB)
| |
| Low Memory |
| |
+------------------+ <- 0x00000000
解释一下, 最低的 Low Memory 是最初的计算机使用的, 目前不再使用
从 0x000A0000 到 0x000FFFFF, 这 384KB 是被硬件保存使用的, 这一部分最重要的是 BIOS(Basic Input/Output System) 占 64KB, 目前的架构中, 内存中的最低的 1MB仍然保存,是为了向下兼容,
The ROM BIOS
BIOS到底是什么呢?
在我们的电脑上, BIOS 是以固件的形式嵌入在我们的主板上的, 也就是PC 中的ROM固件, 是PC 开启时运行的第一个程序, 主要是为了引导其他程序运行, 开机
我们使用 GNU 来调试 QEMU 的执行过程, 具体操作很简单, 打开两个 Lab 的Terminals, 然后在其中一输入 make qemu-gdb, 另一个输入 make gdb 即可实现对 QEMU 的调试, 输出的结果我们得到下面一段输出,
+ target remote localhost:26000
The target architecture is assumed to be i8086
[f000:fff0] 0xffff0: ljmp $0xf000,$0xe05b
0x0000fff0 in ?? ()
+ symbol-file obj/kern/kernel
第一条指令就是:
[f000:fff0] 0xffff0: ljmp $0xf000,$0xe05b
这也就是 GDB 要执行的第一条反汇编指令, 从这条指令我们可以得到以下信息
:
- 指令开始执行的地址是
0x000ffff0
, 这个地址就在BIOS ROM
的64KB之中 - 第一条指令是一个跳转指令, 表示 PC 开始执行的地址, 这个地址就是 CS
0xf000
, IP0xe05b
, 这两个寄存器是 x86结构中的, CS是段寄存器, 存储的是段的基地址, IP 存储的是地址偏移量, - 与我们现在的的 PC 不同的是, 在 IBM 最初的 PC, 以及 QEMU 模拟器中, BIOS 的位置是在地址为
0x000ffff0
地方.