现在的位置: 首页 > 综合 > 正文

linux的高端内存分析

2014年03月29日 ⁄ 综合 ⁄ 共 905字 ⁄ 字号 评论关闭

        linux系统把896M以上的内存定义为高端内存。为什么这么做呢?

        这是 因为linux系统的虚拟地址管理能力为4G,通常用户空间虚拟地址为0~3G的空间,而内核空间虚拟地址为3G~4G的空间。 实际上计算机系统的物理内存通常要多于1G,而内核空间则负责对所有物理内存进行管理,对用户进程来说则是看不到物理内存地址的。

        假如计算机的物理内存为2G,这2G的物理地址将会被内核和不同的用户进程所占用。对内核来说如何把3G~4G这1G的线性地址和0~2G的物理地址对应起来是个问题。

        于是Linux采用了一个折中的办法,把896M物理地址空间的内存线性映射到3G~3G+896M这样的虚拟地址空间中,这样在进行地址转换时可以很快将物理地址和虚拟地址之间进行转换。但实际上这0~896M的物理地址并不能由内核独享,而是要和用户进程共享的,当然另一方面,内核也确实不一定就能消耗这么多的内存。这样以来,就出现了一种情况,对内核来说虽然分配给它的虚拟地址为3G~4G+896M,但实际上内核实际用到的空间则是这3G~4G+896M中的一个个片段。未用的片断对应的物理地址可能空闲,也可能分配给了用户进程。

        当内核需要动态分配内存时,它会调用函数alloc_pages在物理内存0~896M的空间中找出一段连续的内存,然后直接进行线性映射变化为虚拟地址交给内核。这样的处理简单而方便,但限制是只能提供0~896M物理地址空间的物理内存。如果这部分的内存都已经占用了,就只能使用896M~2G空间的高端内存地址,怎么办呢?

        linux在虚拟地址3G+896M~4G这段虚拟地址空间中保留了128M的虚拟地址,可以进行动态的映射,它首先把这部分虚拟地址空间分成一块一块并用vm_struct结构链进行记录,如果有段虚拟地址空间没有使用,那么在需要的时候就可以从高端内存中找出若干离散的物理页面,映射到未用到的虚拟空间,供内核使用。也就是它将3G+896M~4G虚拟地址动态映射到了896M~2G的物理内存空间。这段虚拟地址空间的特点是物理地址页面不连续。

抱歉!评论已关闭.