计算机的实模式和保护模式

计算机的实模式和保护模式

实模式

在一开始的8086处理器中,寄存器总共为 14 个,且均为 16 位 。即 AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG(PSW),CS,DS,SS,ES 。这 14 个寄存器按照一定方式又分为了通用寄存器,控制寄存器和段寄存器。8086的地址总线为20位,最大可支持寻址1MB,但是16位的寄存器只能访问64KB的地址空间,那怎么样能做到在16位寄存器中访问1MB的地址呢?于是引入了分段的思想,即采用段寄存器:IP的方式。首先将段寄存器中地址左移4位代表我要访问的地址在第几段,然后加上IP寄存器中的偏移量即可确定要访问的代码地址。具体得
为了解决这个问题,8086 处理器在形成物理地址时,先将段寄存器的内容左移 4 位(相当于乘以十六进制的10,或者十进制的 16),形成 20 位的段地址,然后再同16位的偏移地址相加,得到20位的物理地址。比如,对于逻辑地址 F000H:052DH,处理器在形成物理地址时,将段地址F000H左移 4 位,变成 F0000H,再加上偏移地址052DH,就形成了20位的物理地址 F052DH。
  这样,因为段寄存器是16位的,在段不重叠的情况下,最多可以将1MB的内存分成65536个段,段地址分别是0000H、0001H、0002H、0003H,……,一直到FFFFH。一个地址有段和偏移两部分组成,物理地址的计算公式为:
物理地址(physicaladdress)= 段寄存器(segment) * 16 + 偏移(offset)
其中,segment和offset都是16位的。

保护模式

最开始的程序寻址是直接“段:偏移”模式,这样的好处是所见即所得,程序员指定的地址就是物理地址,物理地址对程序员是可见的。但也正是因为这样,代码得不到保护。正是因为如此,有了保护模式。保护模式中,段寄存器中存储的再也不是段的真实地址,而是段选择子,通过段选择子来定位我们要访问的段,段选择子中有2位代表特权级,有1位代表访问的是GDT表还是LDT表。另外高13位则是索引下标,他表明要访问的数据或者代码在GDT(全局段描述符)的索引下标,通过其定位到段描述符,然后从段描述符中获得段的基地址,然后加上偏移量就定位到了要访问段的地址。在GDT中,一个段描述符总共位8byte。那么就意味着GDT表最多可容纳2的13次方,也即8192个段描述符。而代表特权级的两位,0代表内核态,3代表用户态,这表示当前的CPL。即当前代码段或数据段的特权级。在段描述符中,也有对应的特权级,为DPL,在非一致性代码中,如果CPL 大于 DPL,则证明无访问权限,报GP异常,这就形成了一定的保护。

通过上述知道,实模式下是直接在段寄存器中放置段基地址,现在则是通过它来存取相应的描述符来获得段基地址和其它信息,这样以来,存取速度会不会变慢呢?为了解 决这个问题,386的每一个段选择符都有一个程序员不可见(也就是说程序员不能直接操纵)的88位(8*8+24)宽的段描述符高速缓冲寄存器与之对应。 无论什么时候改变了段寄存器的内容,只要特权级合理,描述符表中的相应的8字节描述符就会自动从描述符表中取出来,装入高速缓冲寄存器中(还有24位其他 内容)。一旦装入,以后对那个段的访问就都使用高速缓冲寄存器的描述符信息,而不会再重新从表中去取,这就大大加快了执行的时间,如下图所示

img

由于段描述符高速缓冲寄存器的内容只有在重新设置选择符时才被重新装入,所以,当你修改了选择符所选择的描述符后,必须对相应的选择符重新装入,这样,88位描述符高速缓冲寄存器的内容才会发生变化。无论如何,当选择符的值改变时,处理器自动装载不可见部分。

下面讲一下在没有分页操作时,寻址一个存储器操作数的步骤:

  1. 在段选择符中装入16位数,同时给出32位地址偏移量(比如CS :IP),那到GDTR中存的GDT的基地址。

  2. 根据段选择符中的索引值、TI及RPL值,再根据相应描述符表寄存器中的段地址和段界限,进行一系列合法性检查(如特权级检查、界限检查),该段无问题,就取出相应的描述符放入段描述符高速缓冲寄存器中。

  3. 将描述符中的32位段基地址和放在EIP等中的32位有效地址相加,就形成了32位物理地址。

注意:在保护模式下,32位段基地址不必向左移4位,而是直接和偏移量相加形成32位物理地址(只要不溢出)。这样做的好处是:段不必再定位在被16整除的地址上,也不必左移4位再相加。

猜你喜欢

转载自blog.csdn.net/weixin_44821965/article/details/126504068
今日推荐