MIT6.828-Lab1-Part1-PC引导程序

 

PC 引导程序(Bootstrap)

本节目的

  1. 介绍 x86 汇编语言,参考书1
  2. 了解 PC Bootstrap 的过程
  3. 使用 QEMU 和 GDB

PC 物理地址空间

以 4GB 地址空间为例

image-20230421215025914

对于16-bit的处理器,能够访问1MB(20-bit)(0x00000000-0x000FFFFF)的地址空间,这是为什么呢?

首先明确16-bit和20-bit分别代表寄存器的位数和CPU地址线个数。地址线才真正决定了CPU能够访问的内存范围。

那16位的寄存器如何代表20位地址线的呢?

虽然现代内存管理技术是通过分页(page),但以前是分段内存管理技术。$访问地址 = 段基址 \times 16 + 偏移地址$。段基址由段寄存器提供,偏移地址由通用寄存器或指针寄存器提供

只有低640KB(RAM)可以被用户访问,其他的384KB(ROM)作为固定设计使用:

  1. 0x000A0000-0x000C0000: VGA display
  2. 0x000F0000-0x00100000(64KB): BIOS,负责基础系统初始化,例开启显卡、检测挂载的内存大小。初始化后BIOS从合适的位置(软盘、硬盘、CD-ROM、网络)加载操作系统,并将机器的控制权交给OS。

The ROM BIOS

打开两个terminal都 cdlab 目录。先在一个窗口运行 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的指令并尝试着理解它们

参考文献

  1. PC Assembly Language Book