Linux内存分区

本文介绍了Linux内存管理的细节,包括内存节点(pg_data_t)、内存分区(zone)和页框(page)。Linux将内存划分为DMA、Normal和High Memory区,其中High Memory用于映射超过1G的物理内存。内核利用页表实现动态映射,解决大内存的映射问题,并通过备用内存区列表进行跨节点分配,优先考虑本地和高端内存。

  Linux支持多种硬件体系结构,因此Linux必须采用通用的方法来描述内存,以方便对内存进行管理,为此,Linux有了内存节点、内存区、页框的概念。

内存节点(Node):主要依据CPU访问代价的不同而划分。多CPU下环境下,本地内存和远端内存就是不同的节点。内核以struct pg_data_t来描述内存节点。

内存分区(Zone):Linux对内存节点再进行划分,分为不同的分区。内核以struct zone来描述内存分区。通常一个节点分为DMA、Normal和High Memory内存区。

  • DMA内存区:即直接内存访问分区,通常为物理内存的起始16M。主要是供一些外设使用,外设和内存直接访问数据访问,而无需系统CPU的参与
  • Normal内存区:从16M到896M内存区
  • HighMemory内存区:896M以后的内存区

   为什么高端内存的边界是896M? 因为32位Linux虚拟内存空间为0-4G,其中0-3G用于用户态,3G-4G用于内核态。这意味着内核只有1G的虚拟地址空间,如果物理内存超过1G,内核就无法映射了。Linux采取的策略是,内核地址空间的前896M采用固定映射,映射方法是:虚拟地址-3G = 物理地址,只能映射到物理地址的前896M。也就是说内核虚拟地址空间的3G到3G+896M这部分,页表的映射是固定的,系统初始化时就建立起来。而虚拟地址空间的最后128M,也就是3G+896M到4G部分采用动态映射,也就是说页表映射的物理地址可变的。在系统运行过程中,通过更新页表,就可以映射到不同的物理地址,当然也包括高端物理内存。
  这主要解决了两个问题:第一,这可以使内核地址空间映射到高端物理内存;第二,虚拟地址空间的3G+896M到4G部分,连续的虚拟地址空间可以映射到非连续的物理内存,只要通过更新页表就可以做到,这和用户态的虚拟内存映射采用了同样这种方法。这在没有大段连续的空闲物理地址时是非常重要的。

页框(Page Frame):Linux采用页式内存管理,页是物理内存管

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值