IA-32处理器内存管理学习总结?

 

内容来自于《Intel汇编语言程序设计》(第四版)第11章-------32位windows编程。

 

 

其实我们经常看到计算机的虚拟内存地址大于计算机的实际内存地址。这是什么原因呢?这就是内存管理要解释的内容。

 

 

内存管理主要涉及两个方面:

 

  • 从逻辑地址到线性地址的转变
  • 从线性地址到物理地址的转变(分页)

 

所谓逻辑地址,其实就是在段中的偏移地址。比如一个变量的逻辑地址,就是这个变量所在段的偏移地址,我们之前所讲的那些程序中变量的地址其实都是在段中的偏移地址(还记得OFFSET等等指令吗?)。这就是逻辑地址,如果我们这个时候将变量所在的段的地址加上变量在段中的偏移地址,然后到段描述符表中去找的话,交找到了变量的线性地址。如果操作系统没有启用分页机制的话,此时的线性地址就是实际的物理地址。一般我们的XP和LINUX等等操作系统都启用了分页机制,所以此时得到的地址还不是真正的物理地址。(线性地址是一个32位整数,所以他可以操作4GB的内存空间)

 

如果系统启用了分页机制,并且我们又得到了线性地址的话,我们就可以计算出真正的物理地址。所谓分页即系统将内存划分为称为页的小块,大小一般是4KB,如果当我们想访问某个变量的实际地址的时候,处理器就会通过页面转换将线性地址转换为物理地址。

 

 

下面来看看具体是如何变换的。

 

当我们进行逻辑地址到线性地址的转换的时候,需要涉及到一个段描述符,而段描述符存在于两种类型的表中,一个是GDT(Global Descriptor Table,全局描述符表),一个是LDT(Local Descriptor Table,局部描述符表)。GDT的表的基址放在GDTR(全局描述符表寄存器)中,而LDT的表的基址放在LDTR(局部描述符表寄存器)中,GDTR只有一个,而LDTR存放的是在一个多任务的操作系统中当前程序的LDT的基址。

 

有了LDT,我们就可以通过它将段基址+偏移地址换算为线性地址了。

 

 

得到线性地址,下一步就是把线性地址转换到物理地址,这里涉及到三个数据结构:

 

  • 页目录
  • 页表

因为我们的线性地址的结构是这样的:

 

页目录域 + 页表域 +  偏移地址域

 

他们会分别去找相应的数据结构,首先通过页目录域到页目录表中找到页表的基地址,然后将页表域作为索引,从页表中找到对应的物理内存的基地址,然后将我们得到这个页的基地址同我们线性地址中12位的偏移地址相加,就得到了真正的物理地址。

 

这就是IA-32处理器管理内存的方法。

 

 

而接下来我们的操作系统就会担当起内存管理的任务,例如将资源划分为进程和线程进行管理等等。

 

内存管理的核心其实很简单,就是处理器将逻辑地址通过中间的一些地址表转换成真正的物理地址的过程。

 

但我还是有个疑问,GDT在什么情况下才能用到呢?

你可能感兴趣的:(数据结构,编程,linux,虚拟机,XP)