处理器发展的两种处理模式:实模式和保护模式

Intel从80286开始引入保护模式,并与之前已存在的实模式并存。作为CPU运行的两种工作方式,具体有何区别,本文对其做简要说明。

实模式

80286之前,处理器的内部数据总线、外部数据总线及位宽都是16位,但地址总线(物理引脚)为20位。因此它的可访问物理地址空间为 1MB(220字节)。

但是,由于其数据总线及位宽都是16位,最大只能代表有64KB的空间,小于地址总线能代表的1MB空间。为了解决这个问题,设计人员通过用16位的段寄存器内容左移4位,并和16位的段内偏移相加组成的20位代表1MB空间:物理地址 = (段寄存器内容 << 4) + 段内偏移。

通过这种方式能表示的内存地址最大范围即为:0xfff << 4 + 0xffff = 0x10 ffef。已大于1MB,为使地址正常访问,对已得地址对1MB取模,此方法称为 wrap-around。

现代处理器地址总线数已远超20,但是为了向下兼容,系统刚加电时依旧使用实模式。

保护模式

实模式带来了一些问题,主要是物理地址可见带来的无法保证地址空间的安全性问题:不区分系统程序及用户程序,用户可随意更改处于物理内存的敏感数据,极易导致系统崩溃。因此引入保护模式。

以现在32位处理器为例:内部数据总线、外部数据总线、位宽及地址总线都为32位。

处于保护模式时,寻址方式发生些许改变:由逻辑地址转换为物理地址(开启分页时,中间需通过线性地址进行转换,本文不开启分页)。

逻辑地址由 16位段选择符和32位偏移量组成。段选择符格式如下图:

img

字段名描述
索引指定了放在GDT或LDT中的相应段描述符的入口
TITI(Table Indicator)标志,指明段描述符是在GDT中(TI=0)或在LDT中(TI=1)
RPL请求者特权级,当相应的段选择符装入到cs寄存器中时指示出CPU当前的特权级,它还可以用于在访问数据段时有选择地削弱处理器的特权级

索引指向存放在GDT(Global Descriptor Table,全局描述符表)或LDT(Local Descriptor Table,局部描述符表)中的段描述符,而段描述符中会存放段基地址,将得到的段基地址与逻辑地址中的段偏移量相加即得物理内存地址。

总结

实模式中内存被划分成段,每个段的大小为64KB,而这样的段地址可以用16位来表示。内存段的处理是通过和段寄存器相关联的内部机制来处理的,这些段寄存器(CS、DS、 SS和ES)的内容形成了物理地址的一部分。具体来说,最终的物理地址是由16位的段寄存器和16位的段内偏移地址组成的。

在保护模式下,段是通过一系列被称之为“描述符表”的表所定义的。段寄存器存储的段选择符,指向GDT或LDT中的位置。