0x00 引言
由于历史原因,x86架构的CPU在加载内核时保留了实模式-保护模式的过程,为了更深入地理解系统,本文将大致分析x86架构的运行过程。
0x01 实模式
试问计算机主板开机上电后到启动,发生了什么?
首先我们需要知道开机后 CPU 和内存所处的状态,开机后 CPU 初始模式是实模式,1MB以内的内存操作均为实模式。而这1MB的空间划分是固定的,每一块都有规定的用途的。而我们主要关注的是BIOS、MBR、LOADER三部分。
1 | 1 BIOS |
1、BIOS
开机后 CPU 的指令寄存器 ip 被强置为地址 0xFFFF0,这一地址被映射到 BIOS 固件代码的入口,这就是计算机开机后的第一条指令的地址。随后CPU 开始执行 BIOS 上的代码,BIOS主要实现的功能如下:
- 硬件输入输出设备相关的检查,以及建立一个最初的中断向量表;
- 检查启动盘上的 mbr 分区,所谓 mbr 分区就是磁盘上的第一个 512B 内容,又叫引导分区;BIOS 会对这 512B 做一个检查:它的最后2个字节必须是两个 magic number:0x55 和 0xaa,否则它就不是一个合法的启动盘;
- 检查通过后,BIOS 将这 512B 加载到内存 0x7C00 处,到 0x7E00 为止,然后指令跳转到 0x7C00 开始执行;至此 BIOS 退出舞台。
2、MBR
MBR即引导分区,其大小被限制在了 512B,其主要功能如下:
- 负责将后面的LOADER部分从磁盘加载到内存,并跳转到LOADER继续执行。
3、LOADER
LOADER是实模式的最后一步,其大小并不固定,但是其大小不能超过1MB区域,其主要功能如下:
- 建立 GDT(Global Descriptor Table),初始化内核代码和数据段寄存器,带领 CPU 进入保护模式;
- 建立 kernel 页目录(page directory)和页表(page tables),打开虚拟内存(virtual memory),进入 paging 模式;
- 加载 kernel 镜像到内存,然后进入到 kernel 代码执行,至此系统的控制权转交到了 kernel
0x02 保护模式
在LOADER加载了kernel后,就正式进入了保护模式(从内存空间上来看,在2MB区域后)