X86段页式内存寻址学习

X86段页式内存寻址学习

Intel所有型号的处理器在启动时或者reset后,都处于实模式,而今几乎所有的操作系统都工作在保护模式下。实模式和保护模式都使用分段的方式管理程序的代码和数据,但是他们却有着本质的不同。

实模式下的内存寻址

8086/8088的时代没有保护模式的概念,它们送上地址总线的都是物理地址。8086的片外总线位宽一共20位,从AD0~AD19,这20位总线是被地址总线,数据总线和控制总线分时复用的。8086有20位地址总线,可以寻址到1M个字节,注意这个线是片外总线,不是CPU片内总线。但是,8086的片内总线是16位的,也就是在8086的内部,一次最多只能处理16位的数据,所以不论是CS还是IP,都只有16位,CS+IP只能送出一个16位的地址,但是CPU外面的地址总线有20位,所以Intel的做法是通过硬件设置,将段寄存器中的值X16,也就是左移4位,就得到一个20位的值,低4位通过硬件设为0,这个值就是段的基地址base,在地址加法器中将这个base与IP中的偏移量相加,就合成了一个20位的物理内存单元的地址,然后将这个地址送上地址总线。这就是8086实模式下的寻址。在这里插入图片描述
80286既可以工作在实模式下,也可以工作在保护模式下。本质上80286的实模式也是用20位的段地址加上偏移,但是在具体实现上与8086有一些差别。80286第一次为段寄存器设计了一个描述符高速缓存,称为Segment Descriptor Cache,所有的段寄存器都有一个属于自己的描述符Cache。这个描述符Cache是对程序员隐藏的,也就是Intel手册中所说的“不可见部分”。因为Intel手册上关于描述符Cache的说明含糊不清,但是根据一些资料和我自己的推理,段寄存器和描述符Cache中间应该由一个高速通道相连,而不是网上所说的把段描述符包含在段寄存器内。下面这幅图是我根据自己的理解画的段寄存器和描述符Cache的关系。
在这里插入图片描述
因为描述符Cache主要是在保护模式中发挥作用,所以在说保护模式的时候再说它的细节。这个东西就是设计用来缓存保护模式下的8个字节段描述符的,虽然是保护模式下才会被装入有用的值,但是80286是兼容实模式和保护模式的,所以在实模式下,这个描述符Cache也会被用到,这就是和之前8086的不同。8086内部的BIU(总线接口单元)没有设计描述符Cache,所以段地址的左移4位应该是由硬件的内部机制进行左移4位的操作,但是80286因为有描述符Cache,所以80286会利用这个Cache进行加速。同样,Intel286的手册里对这些没有进行详细描述,所以我根据286手册中的描述和286段描述符Cache的结构猜测了它的加速结构。

首先是286手册中的描述:
在这里插入图片描述
然后是我查到的286内部描述符Cache的结构:
在这里插入图片描述
从286开始,因为CPU在上电后是实模式,这时CPU会向描述符Cache中加载一些”实模式兼容“的值。在保护模式下,CPU装载到描述符Cache中的值都是有意义的值,但是实模式下CPU装载到描述符Cache中的值都是一些固定的默认值(这只针对上电后,如果是从保护模式返回实模式,描述符Cache中的值就是之前保护模式留下的值,此时CPU不会再以固定的默认值重新装载描述符Cache)。
在这里插入图片描述
286有24根地址线,但是在实模式下,A20 ~ A23是不开启的,所以只有A0 ~ A19的20根被使用。上电后,描述符Cache中base域的低4位会直接被设置为0
在这里插入图片描述
所以我推测80286的BIU单元内部大致是下图这样的结构,只关注地址合成的部件,不包含指令预取队列部件:
在这里插入图片描述
这里面的描述符Cache的内容就是上上面的标出来的,即使在实模式下,寻址也用到了段描述符Cache。因为段描述符Cache参与到地址合成,base的低4位在上电之后就被硬件设置为0,地址合成时,CS中的内容直接被CPU载入描述符缓存的第4 ~ 19位,正好一个段寄存的宽度,因为A20 ~ A23地址线未开启,地址加法器取base域的低20位作为段基址,再从IP中取得偏移,相加之后就得到了一个物理地址,然后送上20位地址总线。这就是在有描述符Cache参与下的实模式寻址。

i80386的实模式寻址和286是类似的,因为386也有描述符Cache,和286不同的是,386的描述符Cache增加到了96位。
在这里插入图片描述

保护模式下的内存寻址

CPU运行在实模式还是保护模式取决于CR0的0位(PE位),如果将PE置位,CPU就进入保护模式,这个时候CPU访问到地址不再是物理地址,而是一个虚拟地址。保护模式下的寻址涉及到3种地址:虚拟地址(逻辑地址),线性地址和物理地址。

虚拟地址,在Intel手册称为逻辑地址,它由段选择子和一个偏移量构成:
在这里插入图片描述
保护模式下的段寄存器里面不再直接存放段基地址,而是存放段选择子。段选择子就是一个索引,它的作用就是一个GDT的指针。通过段选择子,CPU在GDT中找到相应的段描述符,每一个段描述符都有8个字节
在这里插入图片描述
CPU在找到段描述符后,不会直接把它装载进段描述符Cache中,而是先进行权限等访问控制信息的检查,检查通过后,CPU直接把8个字节的段描述符填充到段描述符Cache中,目的就是为了减少一次总线周期。但是段描述符是8个字节,也就是64位,而描述符Cache有96位,具体64位的段描述符如何填充到96位的描述符Cache中,下次周报再详细说。

时间仓促,保护模式还有一部分东西没有细说,下次再补上吧。

猜你喜欢

转载自blog.csdn.net/weixin_44395686/article/details/105620435
今日推荐