深入Linux内核架构—内存管理(一)

内存管理是内核最复杂同时也是最重要的一部分。特点在于非常需要处理器和内核之间的协作。本章从技术方面讲解具体的实现。

一、概述

内存管理的实现涵盖了许多领域:

内存中的物理内存页的管理;

分配大块内存的伙伴系统;

分配较小块内存的slab、 slub和slob分配器;

分配非连续内存块的vmalloc机制;

进程的地址空间。

Linux内核一般将处理器的虚拟地址空间划分为两个部分。底部比较大的部分用于用户进程,顶部则专用于内核。虽然(在两个用户进程之间的)上下文切换期间会改变下半部分,但虚拟地址空间的内核部分总是保持不变。在IA-32系统上,地址空间在用户进程和内核之间划分的典型比例为3∶ 1。给出4 GB虚拟地址空间, 3 GB将用于用户空间而1 GB将用于内核。通过修改相关的配置选项可以改变该比例。但只有对非常特殊的配置和应用程序,这种修改才会带来好处。目前,只需假定比例为3∶ 1,其他比例以后再讨论。

可用的物理内存将映射到内核的地址空间中。访问内存时,如果所用的虚拟地址与内核区域的起始地址之间的偏移量不超出可用物理内存的长度,那么该虚拟地址会自动关联到物理页帧。这是可行的,因为在采用该方案时,在内核区域中的内存分配总是落入到物理内存中。不过,还有一个问题。虚拟地址空间的内核部分小于CPU理论地址空间的最大长度。如果物理内存比可以映射到内核地址空间中的数量要多,那么内核必须借助于高端内存方法来管理多余的内存。在IA-32系统上,可以直接管理的物理内存数量不超过896 MB。超过该值(直到最大4 GB为止)的内存只能通过高端内存寻址。

4 GB是32位系统上可以寻址的最大内存(2^32 = 4 GB)。如果使用一点技巧, 现代的IA-32实现在启用PAE(Page Address Extension)模式的情况下管理多达64 GB内存。该特性为内存指针提供了额外的比特位。但并非所有64 GB都可以同时寻址,而是每次只能寻址一个4 GB的内存段。

由于大多数内存管理数据结构只能分配在内存范围0和1 GB之间,因此最大的内存实际极限小于64 GB。准确的数值依内核配置而有所不同。例如,可以在高端内存中分配三级页表的项,以减少对普通内存域的占用。

在64位计算机上,由于可用的地址空间非常巨大,因此不需要高端内存模式。即使物理寻址受限于地址字的比特位数,也是如此。

只有内核自身使用高端内存页时,才会有问题。在内核使用高端内存页之前,必须使用kmap和kunmap函数将其映射到内核虚拟地址空间中,对普通内存页不必要的。但对用户空间进程来说,是高端内存页还是普通内存页完全没有任何差别。因为用户空间进程总是通过页表访问内存,不会直接访问。

有两种类型计算机,分别以不同的方法管理物理内存。

(1) UMA计算机( 一致内存访问)将可用内存以连续方式组织起来(可能有小的缺口)。 SMP系统中的每个处理器访问各个内存区都同样快。

(2) NUMA计算机( 非一致内存访问)总是多处理器计算机。系统的各个CPU都有本地内存,可支持特别快速的访问。各个处理器之间通过总线连接起来,以支持对其他CPU的本地内存的访问,比访问本地内存慢些。

图3-1说明两种方法之间的差别。

两种类型计算机的混合也是可能的,其中使用不连续的内存。在UMA系统中,内存不是连续的,而有比较大的洞。在这里应用NUMA体系结构的原理通常有所帮助,可以使内核的内存访问更简单 。内 核 会 区 分 3 种 配 置 选 项 : FLATMEM(平坦内存模型
)、 DISCONTIGMEM(不连续内存模型)和 SPARSEMEM(稀疏内存模型)。DISCONTIGMEM和SPARSEMEM实际上作用相同,但从开发者的角度看来,对应代码的质量有所不同。SPARSEMEM被认为更多是试验性的,不稳定,但有一些性能优化。认为DISCONTIGMEM相关代码更稳定一些,但不具备内存热插拔之类的新特性。

讨论主要限于FLATMEM。在大多数配置中都使用该内存组织类型,通常它也是内核的默认值。由于所有内存模型都使用同样的数据结构,不讨论其他选项也没多大损失。

真正的NUMA会设置配置选项CONFIG_NUMA,相关的内存管理代码与上述两种变体有所不同。由于平坦内存模型在NUMA计算机上没有意义,只有不连续内存模型和稀疏内存模型是可用的。但要注意,通过配置选项NUMA_EMU,可以用平坦内存模型的AMD64系统来感受NUMA系统的复杂性,是将内存划分为假的NUMA内存域。在没有真正的NUMA计算机可用于开发时,该选项是有用的,由于某种原因, NUMA计算机过于昂贵。

主要集中在UMA系统,不考虑CONFIG_NUMA。并不意味着NUMA相关的数据结构可以完全忽略。由于UMA系统可以在地址空间包含比较大的洞时选择配置选项CONFIG_DISCONTIGMEM,这种情况下在不采用NUMA技术的系统上也会有多个内存结点。

注意,在下文的讨论中,会经常遇到术语分配阶( allocation order)。它表示内存区中页的数目取以2为底的对数。阶0的分配由一个页面组成,阶1的分配包括2^1=2个页,阶2的分配包括2^2=4个页,依次类推。
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值