文章目录
前言
今天来学习 CPU 的工作模式,硬件中最重要的就是 CPU,它就是执行程序的核心部件。按照 CPU 功能升级迭代的顺序,CPU 的工作模式有实模式、保护模式、长模式,这几种工作模式下 CPU 执行程序的方式截然不同,下面来讨论这几种工作模式。
一、实模式
实模式是最简单,也是最原始的一种工作模式。实模式实模式又称实地址模式,实,即真实,这个真实分为两个方面,一个方面是运行真实的指令,对指令的动作不作区分,直接执行指令的真实功能,另一方面是发往内存的地址是真实的,对任何地址不加限制地发往内存。
1.1实模式寄存器
由于CPU是根据指令完成相应的功能,举个例子:ADD AX,CX;这条指令完成加法操作,AX、CX 为 ADD 指令的操作数,可以理解为 ADD 函数的两个参数,其功能就是把 AX、CX 中的数据相加。指令的操作数,可以是寄存器、内存地址、常数,其实通常情况下是寄存器,AX、CX 就是 x86 CPU 中的寄存器。
看看 x86 CPU 在实模式下的寄存器。表中每个寄存器都是 16 位的。
1.2实模式下访问内存
我们都知道,数据和指令都是存放在内存中,所以我们要访问内存,而访问内存靠的是地址值。
那这个地址值是如何计算呢?如下图所示:
由上图发现所有的内存地址都是由段寄存器左移 4 位,再加上一个通用寄存器中的值或者常数形成地址,然后由这个地址去访问内存。这就是大名鼎鼎的分段内存管理模型。
代码段地址+左移4位+ IP = 取指
数据段+左移4位+ 通用寄存器值 = 数据地址
栈段SS+左移4位 + SP = 栈地址
注意:代码段是由 CS 和 IP 确定的,而栈段是由 SS 和 SP 段确定的!!
1.3实模式中断
中断就是中止执行当前的程序,转到另一个特定的地址上,去运行特定的代码。那么实模式下它的中断是如何产生的呢?
第一种情况,中断控制器给 CPU 发送了一个电子信号,CPU 会对这个信号作出应答。随后中断控制器会将中断号发送给 CPU,这是硬件中断。
第二种情况, CPU 执行了 INT 指令,这个指令后面会跟随一个常数,这个常数即是软中断号。这种情况是软件中断。
为了实现中断,就需要在内存中放一个中断向量表,这个表的地址和长度由 CPU 的特定寄存器 IDTR 指向。实模式下,表中的一个条目由代码段地址和段内偏移组成,如下图所示。
有了中断号后,CPU 就能根据 IDTR 寄存器中的信息,计算出中断向量中的条目,进而装载 CS(装入代码段基地址)、IP(装入代码段内偏移)寄存器,最终响应中断。
即:中断号+ IDTR 寄存器(指向中断表的地址和长度) —> 根据中断号,找到中断表中的对应条目 —> 解析出中断函数基地址填充CS、中断函数偏移填充IP —> 响应中断。
二、保护模式
随着软件的规模不断增加,需要更高的计算量和更大的内存容量。而内存一大,首先就要解决的问题就是寻址问题。原本实模式下的16位寄存器最大只能表示2的16次方个地址,所以CPU的寄存器和运算单位都要扩展成32位的。
虽然CPU内部器件的位数解决了计算和寻址的问题,但依旧是没有解决实模式场景下的问题:①CPU对任何指令不加区分的执行;②CPU对访问内存的地址不加限制。
基于以上的原因,CPU实现了保护模式。
保护模式包含特权级,对指令及其访问的资源进行控制,对内存段与段之间的访问进行严格检查,没有权限的绝不放行,对中断的响应也要进行严格的权限检查,扩展了 CPU 寄存器位宽,使之能够寻址 32 位的内存地址空间和处理 32 位的数据,从而 CPU 的性能大大提高。
2.1保护模式寄存器
保护模式相比于实模式,增加了一些控制寄存器和段寄存器,扩展通用寄存器的位宽,所有的通用寄存器都是 32 位的,还可以单独使用低 16 位,这个低 16 位又可以拆分成两个 8 位寄存器,如下表所示:
2.2保护模式特权级
为了区分哪些指令和哪些资源可以被访问,CPU实现了特权级。
下图中,从外到内,既能体现权力的大小,又能体现各特权级对资源控制访问的多少,还能体现各特权级之间的包含关系。R0~R3,每个特权级执行的指令的数量不用。R0 拥有最大权力,可以访问低特权级的资源,反之则不行。
2.3保护模式段描述符
由于CPU的扩展导致了 32 位的段基地址和段内偏移,还有一些其它信息,所以 16 位的段寄存器肯定放不下。放不下就要找内存借空间,然后把描述一个段的信息封装成特定格式的段描述符,放在内存中,其格式如下。一个段描述符有 64 位 8 字节数据,里面包含了段基地址、段长度、段权限、段类型(可以是系统段、代码段、数据段)、段是否可读写,可执行等。