看操作系统虚拟化原理总结篇——内存管理机制

来源:互联网 发布:ps cc mac中文破解版 编辑:程序博客网 时间:2024/05/29 08:32

1.X86的地址空间

逻辑地址,线性地址,物理地址。  逻辑地址是程序中直接用到的地址,是由一个16位的段选择符和一个32位的偏移量构成,代码中的变量的地址存储的实际是逻辑地址的偏移部分,也就是说这个段选择符其实是存在于逻辑地址的高多少位的,这个对于程序来说是可见的。

线性地址和物理地址,这里和分页机制开启是否有关,若开启则必须要将逻辑地址转换成线性地址再转换到物理地址,若未开启,则线性地址=物理地址。


2.内存管理机制

分段机制:由四部分构成,逻辑地址,段选择符,段描述符,段描述符表。 CPU通过逻辑地址中的段选择符去索引段描述表然后找到段描述符,若以上都合法,则根据段描述符的基地址将逻辑地址转换成线性地址。
    那么段选择符是如何获得的呢?都知道这个选择符是存在于代码中的,那么为了使CPU能快速的获得段选择符,x86提供了6个段寄存器,这个用来存放当前程序的各个段的选择符。
    段描述符呢,这个是用来描述一个段的,包括多大,基地址,等等。当查找到段描述符后,首先会检查合法性,然后会将其中的32位基地址和逻辑地址中的32位偏移量相加得到线性地址。
      段描述符表,段选择符去索引段描述是通过这个段描述符表来查找的,分为两种个,GDT,LDT。位了加速对GDT和LDT的访问,x86提供了GDTR和LDTR的寄存器。程序可以使用LGDT和SGDT来对GDTR进行读取或存储,一般来说GDTR寄存器一般不会太大变化,而LDTR在每个进程切换的时候对会被替换成LDT的段描述符。

来个逻辑地址转换成线性地址的总结:
1,程序加载;
2,通过进程的LDT的段选择符索引GDT,获得LDT的段描述符,被加载到LDTR寄存器。
3,然后将段寄存器加载到段选择符,CPU根据选择符索引GDT或者LDT,重新加载CS DS SS。
4,从DS对应的段描述符寄存器获得段的基地址,然后和偏移量相加,得到线性地址。
总之,就是先找到通过LDTR 来找到LDT,然后通过CS DS 去查找到LDT,最后重新更新CS DS,然后根据更新的信息+偏移量获得线性地址。


分页机制:
其核心思想就是通过页表将线性地址转换成物理地址,并配合旁路的缓冲区TLB来加速转换过程,通过CR0的PG位置1来开启。 
由三部分组成:页表,CR3寄存器,TLB。
开始说到分段机制找到了线性地址,那么开启分页机制之后的线性地址是什么呢,他由三部分组成,页目录,页表,偏移。
所以我们是通过目录找到页目录项,然后表找到页表项,最后和偏移量做加法。
然后一步一步分析: CPU要索引页目录,必须先找到页目录的物理地址,而这个是存放在CR3寄存器中的。 然后找到了页目录,然后再找到页表项,最后和偏移地址做叠加。
其中,找页表项的时候,在页表项中有个P字段,而这个字段使虚拟内存成为可能。P=1,物理页面存在于物理内存中,可以直接访问该页面;P=0,页面不在物理内存中,访问的时候会产生一个缺页中断,然后交由操作系统去处理。

TLB能将最近用到的页面进行缓存, 这里可以看出,缓存的也只是页面,而不是具体的物理地址,最后还得和线性地址进行叠加,得到物理地址。
而如何更新TLB呢,两种办法:更新CR3,导致TLB整体被刷新;INVLPG指令,对单独的页面进行刷新。

再来一次总结:
首先CPU访问一个线性地址,若存在于TLB中,则和偏移量相加得到物理地址。
若不存在呢,则需要查找页目录项,然后查找页表,最后和偏移地址相加,并且把映射插入到TLB中。






0 0
原创粉丝点击