IA32CPU内存管理机制

最近看了一些Inter32CPU的内存管理机制,做个总结,但是我毕竟是新手,对很多东西也是一知半解,希望大家指教。
1.物理内存的管理,这不考虑MMU的内存管理机制,纯粹的对物理内存的管理,在电脑刚启动时候的实模式就应该是对实际物理内存的操作了。
2.虚拟内存的管理,Inter32CPU实现了一个分页的虚拟内存管理机制。

IA32CPU内存管理机制主要就是:分段和分页。平时程序里说的代码段,数据段不完全等于这个段。分页机制可以实现按需内存分配,虚拟地址等功能。对于分段和分页相结合的模式,非常灵活,最简单的情况下,采用平展段模式,禁止分页(通过CRO寄存器的一个比特位来实现)。要是复杂起来,采用不同段管理不同进程的不同数据,采
用分页机制实现按需分配,虚拟内存等。。。

下面这张图显示了IA32整个内存管理机制

这里又来了逻辑地址,线性地址,物理地址等一大堆的概念,看看http://blog.csdn.net/firefoxbug/article/details/6911737。

上面这张图很好的解释了整个分段模式和分页模式的综合应用。下面是一些简单的解释。

首先是逻辑地址转换成线性地址(上图的左半张)

分段模式下,CPU要寻址整个地址空间,分成了很多个段。代码段,数据段以及各个段的访问方式(读写等)都存取在一个段描述表中(GDT),GDT中每一项都描述了一个特定的段,所以要找一个段的基地址需要两个数据:GDT的初始地址+GDT内段项的偏移量。GDT的初始地址存在了GDTR寄存器中了,GDT内段项的偏移量则是由段选择子来确定,实际上CS,DS这些就是段选择子。通过上面两个数据就确定了线性地址中的段部分(确切的说是确定了段基地址),要组合成实际的线性地址,还需要的段内的偏移,这个地址是一个有效地址。通过段+偏移就出来了线性地址。

出来了线性地址之后,怎么样转化成物理地址呢??

1.要是没有分页模式的话,直接把线性地址当作物理地址处理。这个很简单就可以理解。

2,要是开启了分页模式的话,就有点复杂了。

下面解释线性地址转化成物理地址(第一张图的后半张)

这就是分页模式的图解

(1)CPU根据CR3寄存器的值获取页目录所在物理地址,从而获取页目录在内存中的位置。

(2)CPU根据线性地址的前10位(22~31)形成一个索引,根据这个索引查找页目录,找到页表项。

(3)CPU根据线性地址的中间10比特位(12~21)形成页表内索引,再根据第(2)步骤找到的页表地址找到页框的物理地址。

(4)CPU根据最后12比特形成偏移地址,和(3)的地址相加后得到实际的物理地址。

其实上面我漏了很多细节,我觉得细节怕讲错了,而且比较难。。。下午还要大物期中考试,得看会书了。。

标签:OS