这是我参与 8 月更文挑战的第 4 天,活动详情查看: 8月更文挑战
CPU 工作模式包括实模式、保护模式、长模式
实模式
该模式下运行真实的指令,对指令的动作不作区分,直接执行指令的真实功能;发往内存的地址是真实的,对任何地址不加限制的发往内存。
x86模式下相关寄存器如下:
现在需要考虑如何在实模式下访问内存,一般内存地址由段寄存器(cs)左移四位,再加上一个通用寄存器中的值或者常数形成地址,然后由这个地址去访问内存。
需要注意的是,
- 代码段由CS和IP决定
- 栈段由SS和SP决定
在实模式下的中断实现:先保存CS和IP寄存器,然后装载新的CS和IP寄存器。中断的产生有多种情况:
-
中断控制器给CPU发送一个电子信号,CPU会对这个信号做出应答。随后中断控制器会将中断号发送给CPU,这为硬件中断
-
CPU执行了INT指令,这个指令后面会跟随一个常数,这个常数为软中断信号,
为了实现中断,就需要在内存中放一个中断向量表,这个表的地址和长度由CPU特定寄存器IDTR指向。实模式下,表中的一个条目由代码段地址和段内偏移组成。
保护模式
保护模式相比于实模式,增加一些控制寄存器和段寄存器,扩展通用寄存器的位宽,所以的通用寄存器都是32位的,还可以单独使用低16位,这个低16位又可以拆分成两个8位寄存器。
保护模式特权级
为了区分哪些指令和哪些资源可以被访问,CPU实现一些特权级。分为四级,R0~R3。R0可以执行所有指令,R1、R2、R3依次递减。
保护模式段描述符
由于CPU扩展导致32位的段基地址和段内偏移,还有一些其他的信息,所以16位的段寄存器肯定放不下。把描述一个段的信息封装成特定格式的段描述符,放在内存中
多个段描述符在内存中形成全局段描述符表,该表的基地址和长度由CPU和GDTR寄存器指示。