JILK - CPU - (5) - CPU管理的内存模型

来源:互联网 发布:cocos2d js 官网 编辑:程序博客网 时间:2024/05/18 08:42

CPU提供了一些相关的措施来管理物理内存,这些管理方式的存在旨要是:将程序里所出现的逻辑地址与计算机的物理内存地址解耦合。如果直接将应用程序里的逻辑地址与物理内存地址等同起来,那么就相当于两者紧密的耦合在一起了,硬件的发展和操作系统的演化都呼唤更具灵活的方式来决定如何将逻辑地址和物理地址进行映射。因此就需要CPU建立相应的内存管理机制,以便解耦程序的逻辑地址和物理地址。CPU的内存管理机制既能灵活地提供逻辑地址与物理地址之间的映射方案,又能提供对内存访问的相应保护措施。这样程序员的视角里只需要关心程序的逻辑地址空间,逻辑地址空间与物理地址空间之间的映射交由CPU和操作系统来处理。

Intel CPU提供的内存管理模型有三种:

1)平坦的内存模型(Flat memory model)。从一个应用程序的角度,其所操纵的逻辑地址都落入在一个线性地址空间里,包括程序的代码、所用的数据、堆栈等东西都落入这个线性地址空间里。在非64位模式下,这个线性地址空间为4G(2^32)大小。每个应用程序都认为自己拥有一个4G大小的线性地址空间,然后每个应用程序里的线性地址空间一般再通过页式管理,与实际的物理地址空间进行映射。当启用页式管理时,线性地址空间被划分为一页页,每页的大小一般是4KB(当应用了扩展页面大小(Page Size Extensions, PSE)后,页面的大小可为4MB),然后物理地址空间也被划分为一页页,当然这里的物理地址空间所包含不一定只是物理内存,也可以是物理硬盘上的一部分区域。线性地址空间里的一页映射到物理地址空间里的一页,从而为内存的管理提供了非常大的灵活性。譬如页面的粒度大小可调,所支持的物理地址空间的大小可调(当启用页地址扩展(Page Address Extensions, PAE)后,可支持超过4GB大小的物理内存;而在64位模式下,支持的物理地址空间可超过64GB)。

2)分段的内存模型(Segmented memory model)。从一个应用程序的角度,其所操纵的逻辑地址都落入一个个的段里,每个段有各自的起始逻辑地址和各自的大小,这些都由段的描述符来描述。其实质就是将线性空间划分成一个个的段,段与段之间可以重叠。譬如CPU根据一个逻辑地址得到其所在的段描述符和在段内的偏移量后,经过运算得出其段内地址,然后这个段内地址就是作为一个线性空间里的地址,然后再映射到具体的物理地址中去。在64位模式下,CPU已经无视段的存在(FS、GS除外),认为所有段的基地址都在线性地址0,而直接应用平坦的内存模型。

3)实地址的内存模型(Real-address mode memory model)。这是8086下的内存模型。其实它就是分段的内存模型的特例化,因实地址的内存模型也是一种分段的内存模型,只不过其每个段的大小均为64KB,且其线性地址空间最大为1MB。

Three memory management models

上图来自《Intel 64 and IA-32 Architecture Software Developers Manaual Volume1》。

在不同的CPU操作模式下,可用的内存模型会有所不同:

1)在保护模式(Protected mode)下,三种内存模型都可用得上,而实地址模型只能在虚拟8086模式下使用。

2)实地址模式(Real-address mode)下,在该模式下,只能使用实地址模型了。

3)系统管理模式(System management mode)下,CPU切换到了一个称为系统管理RAM(system management RAM)的独立地址空间里,访问该地址空间的模型与实地址模型相似。

4)兼容模式(Compatibility mode)下,可用的内存模型与32位的保护模式下的一样。

5)64位模式(64-bit model)下,分段模型和实地址模型被抛弃,直接应用平坦的模型,得到64位的线性地址空间。