[Linux 0.11] Draft 2 80386 System Architecture
此文对 Intel 80386 的系统架构进行一定程度的说明
80386 在系统层面支持下面的功能
- 保护
- 内存管理
- 多任务
- IO
- 异常和中断
- 初始化
- 协处理器,多处理技术
- 调试功能
上述均通过系统寄存器以及指令来支持,下面会对这些进行介绍
系统寄存器(Registers)
系统寄存器分为如下几类
- EFLAGS
- 内存管理寄存器
- 控制寄存器 (Control Registers)
- 调试寄存器 (Debug Registers)
- 测试寄存器 (Test Registers)
下面对每一类寄存器进行说明
System FLAGS
EFLAGS 中的 System FLAG 可以控制如 IO, 可屏蔽中断,任务切换,调试等功能。
- IF: 用来控制系统是否接受(可屏蔽的)外部中断请求 IF = 0 为屏蔽
- NT: 此位用于控制 Chain interrupted 以及 called tasks, 该位会影响 IRET 指令的操作方式
- RF: debug 有关的 flag
- TF: debug 有关的 flag,将处理器设置为单步执行模式,在这个模式下,所有的指令CPU都会产生一个异常,可以在每一个指令处停下来进行调试
- VM: 用于进入 Virtual 8086 Mode 的 flag 这里不做解释
内存管理寄存器
与内存分段管理相关的寄存器,如全局描述符表,中断描述符表,也就是 GDT, LDT, IDT 和 Task 的描述信息存储用的寄存器
- GDTR
- LDTR
- IDTR
- TR 上述三个不用介绍,这个为 Task Register,用于指向当前执行的 Task 的相关元信息
控制寄存器
控制寄存器有 CR0, CR1, CR2, CR3 其中 CR1 留作 Intel 以后使用,在80386中没有实际用途。其余三个都可以通过,而且仅可以通过 MOV 指令来进行操作,将其从通用寄存器中装入,或者存入通用寄存器
- CR0 对整个系统控制,不针对某一个任务,CR0 可以控制协处理器相关的操作(EM, ET, MP) 以及 开启保护模式 (PE) 开启分页模式 (PG) 获取任务切换状态(TS)
- CR2 用来处理缺页异常,CR2 中存储的是触发缺页异常的线性地址的值
- CR3 用来指定当前任务中页表所在的地址
CR2, CR3 均是分页相关的寄存器
调试寄存器
暂略
测试寄存器
单独为了 TLB 提供支持的寄存器,TLB (Translation Lookaside Buffer) 又称内存快表
—–
下面再对通用寄存器进行说明
通用寄存器
通用寄存器分为三类
- 通用寄存器 General Register
- 段寄存器 Segment Register
- 状态寄存器 & 指令寄存器
通用寄存器
- 可以做 32bit, 16bit, 8bit的寄存器为 EAX EBX ECX EDX
- 可以做 32bit,16bit的寄存器 EBP ESI EDI ESP
分段寄存器
- CS Code Segment 当前代码段的地址
- SS Stack Segment 类似上文
- DS Data Segment
- ES FS GS 同样为 Data Segment
状态和指令寄存器
- EFLAGS 存储着状态
- EIP 为指令寄存器,指向要取的指令
Stack 操作
Stack 操作使用的寄存器为 SS, ESP, EBP 分别介绍他们的作用
这里先来介绍一下 80386 CPU 对Stack的实现
Stack 在内存中实现, 指定不同的 Stack 的时候依靠切换 SS 寄存器 ( SS 寄存器指向内存段)
ESP 指针指向当前栈顶
EBP 指向该栈栈底,EBP 用来引用栈内的参数如 EBP + 4 这种