【OS】CPU工作模式(一)

556 阅读2分钟

这是我参与 8 月更文挑战的第 4 天,活动详情查看: 8月更文挑战

CPU 工作模式包括实模式、保护模式、长模式

实模式

该模式下运行真实的指令,对指令的动作不作区分,直接执行指令的真实功能;发往内存的地址是真实的,对任何地址不加限制的发往内存。

x86模式下相关寄存器如下:

image.png

现在需要考虑如何在实模式下访问内存,一般内存地址由段寄存器(cs)左移四位,再加上一个通用寄存器中的值或者常数形成地址,然后由这个地址去访问内存。

image.png

需要注意的是,

  • 代码段由CS和IP决定
  • 栈段由SS和SP决定

在实模式下的中断实现:先保存CS和IP寄存器,然后装载新的CS和IP寄存器。中断的产生有多种情况:

  • 中断控制器给CPU发送一个电子信号,CPU会对这个信号做出应答。随后中断控制器会将中断号发送给CPU,这为硬件中断

  • CPU执行了INT指令,这个指令后面会跟随一个常数,这个常数为软中断信号

为了实现中断,就需要在内存中放一个中断向量表,这个表的地址和长度由CPU特定寄存器IDTR指向。实模式下,表中的一个条目由代码段地址和段内偏移组成。

image.png

保护模式

保护模式相比于实模式,增加一些控制寄存器和段寄存器,扩展通用寄存器的位宽,所以的通用寄存器都是32位的,还可以单独使用低16位,这个低16位又可以拆分成两个8位寄存器。

image.png

保护模式特权级

为了区分哪些指令和哪些资源可以被访问,CPU实现一些特权级。分为四级,R0~R3。R0可以执行所有指令,R1、R2、R3依次递减。

保护模式段描述符

由于CPU扩展导致32位的段基地址和段内偏移,还有一些其他的信息,所以16位的段寄存器肯定放不下。把描述一个段的信息封装成特定格式的段描述符,放在内存中

image.png

多个段描述符在内存中形成全局段描述符表,该表的基地址和长度由CPU和GDTR寄存器指示。

image.png