一、实模式下的地址变换
16位系统中,数据总线为16位,地址总线为20位,可寻址1M地址空间。由于寄存器只有16位,而地址总线是20位,如果只使用一个寄存器存放地址,则寻址范围小于1M。为了充分利用地址空间,采用:段基址+段偏移 的方式,对20位的地址空间进行寻址。(下一指令)物理地址=16CS+IP,其中CS存放段基址,IP存放段偏移,便恰好可以对20位地址空间进行寻址(对堆栈的访问则是SS:SP;对数据段的访问是DS:DI或DS:BX)。
以上就是分段机制,(段基址:段偏移)称为逻辑地址;(16段基址+段偏移)就是物理地址(分段机制中,物理地址就是线性地址)
二、保护模式下的地址变换
2.1 保护模式下分段机制的地址变换
32位系统中,数据总线和地址总线都是32位,可寻址4GB(232)地址空间。32位系统中的段寄存器任然是16位!由于16位段寄存器无法存放32位段基址,段基地址只好存放在一个叫做描述符表的表中,此时段寄存器中存放段选择符,用于在描述符表中选择对应的段,从而得到段基址等信息。
保护模式下,段选择符存放的信息如下,前13位是地址,能寻0到213-1,因此段描述符表的大小就是 8192B,他还牵扯到一些特权级和表选择,对应后三位。段偏移则是32位,即每个段最大4GB(232),而选择段占用了14位(13+1),顾最大虚拟地址空间为64TB(246)
段描述符是用来表示这个段的一些性质的,比如段基址和段长、以及其他段属性等。
此时寻址过程如下:段选择符找到段描述符,然后从段描述符中取出段基址,加上偏移就形成了我们要访问的地址(32位时,基址不需要乘以16,偏移同样来自EIP或BX等寄存器)
实模式下是直接在段寄存器中放置段基地址,现在则是通过它来读取相应的描述符来获得段基地址和其它信息,这样存取速度会不会变慢呢?为了解决这个问题,386的每一个段选择符都有一个程序员不可见(也就是说程序员不能直接操纵)的88位(8*8+24)宽的段描述符高速缓冲寄存器与之对应。无论什么时候改变了段寄存器的内容,只要特权级合理,描述符表中的相应的8字节描述符就会自动从描述符表中取出来,装入高速缓冲寄存器中(还有24位其他 内容)。一旦装入,以后对那个段的访问就都使用高速缓冲寄存器的描述符信息,而不会再重新从表中去取,这就大大加快了执行的时间。如下图所示(下图中的高速缓冲寄存器就是描述符寄存器,描述符寄存器的内容来自描述符表)
上图中全局描述符表、局部描述符表如何找到呢?这就需要通过访问保护模式寄存器(组)中的GDTR(全局描述符表寄存器)、LDTR(局部描述符表寄存器),他们存放了描述符表的基址、限长。
2.2 保护模式下分页机制的地址变换
以上描述的是分段机制分别在实模式和保护模式下的地址变换!
需要补充的是,保护模式带来了两个好处:1.保护机制;2.保护模式下实现了虚拟存储,通过调度,能够使有限的内存“看似更大”(包括请求分页、请求分段等)
页式管理机制下,自动将程序和数据按定长分页,每页4KB(通常情况,而在请求分页的时候,每次调度也是从磁盘读取一个磁盘块的内容,即一页的内容),相应等大小的物理空间称为物理块
页变换的过程如下图所示:
①由线性地址中的高10位乘以4得到页目录项(乘以4是因为每个页目录项占4B,一共1K个页目录项);②由页目录项找到页表的位置,再由线性地址中间10位乘以4找到页表项; ③由页表项找到对应的物理块基址; ④物理基址+偏移量找到内存地址(由上可知,这里就是一个二级页表!)
三、小结
综上,选择符(段基址)+偏移量就是逻辑地址;逻辑地址经过分段部件变换成为线性地址;如果不分页,得到的线性地址就是物理地址。如果分页,上一步得到的线性地址经过分页部件变换后才是物理地址!