[Linux服务器] Linux 内存管理(六)之内存管理区

104 0
Honkers 2025-6-4 16:08:54 来自手机 | 显示全部楼层 |阅读模式


前言

为了支持 NUMA 模型,也即 CPU 对不同内存单元的访问时间可能不同,此时系统的物理内存被划分为几个节点,一个节点对应一个内存簇 bank,即每个内存簇被认为是一个节点。接着各个节点又被划分为内存管理区域,接下来将对内存管理区域进行讨论。

非一致内存访问(Non-Uniform MemoryAccessNUMA)模型,是一种内存架构模型,用于多处理器系统中的内存访问。在 NUMA 系统中,每个处理器或处理器组件(如核心)都有自己的本地内存,并且可以访问其他处理器的远程内存。

一、x86 上的内存区域划分

在一个理想的计算机体系结构中,一个页框就是一个内存存储单元,可用于任何事情:存放内核数据和用户数据、缓冲磁盘数据等等。任何种类的数据页都可以存放在任何页框中,没有什么限制。

但是,实际的计算机体系结构有硬件的制约,这限制了页框可以使用的方式。尤其是 Linux 内核必须处理 80x86 体系结构的两种硬件约束:

  • ISA 总线的直接内存存取(DMA)处理器有一个严格的限制:它们只能对 RAM 的前 16MB 寻址。
  • 在具有大容量 RAM 的现代 32 位计算机中,CPU 不能直接访问所有的物理内存,因为线性地址空间太小。

为了应对这两种限制,Linux 2.6 把每个内存节点的物理内在划分为 3 个管理区(zone)在 80x86 UMA 体系结构中的管理区为:

  • ZONE DMA:包含低于 16 MB 的内存页框。
  • ZONE NORMAL:包含高于 16MB 且低于 896MB 的内存页框。
  • ZONE HIGHMEM:包含从 896MB 开始高于 896MB 的内存页框。


内存区域类型结构定义在 include/linux/mmzone.h,其基本信息如下所示:

  1. #define ZONE_DMA 0
  2. #define ZONE_NORMAL 1
  3. #define ZONE_HIGHMEM 2
复制代码

不同的管理区的用途是不一样的,ZONE_DMA 类型的内存区域在物理内存的低端,主要是 ISA 设备只能用低端的地址做 DMA 操作。ZONE_NORMAL 类型的内存区域直接被内核映射到线性地址空间上面的区域,ZONE_HIGHMEM 将保留给系统使用,是系统中预留的可用内存空间,不能被内核直接映射。

二、管理区结构

1、struct zone

一个管理区(zone)由 struct zone 结构体来描述,zone 对象用于跟踪诸如页面使用情况的统计数、空闲区域信息和锁信息。里面保存着内存使用状态信息,如 page 使用统计,未使用的内存区域,互斥访问的锁等。

该结构体定义在 include/linux/mmzone.h 中,而其中各个字段的含义如下:

  • free pages:管理区中空闲页的数目。
  • pages_min:管理区中保留页的数目。
  • pages_low:回收页框使用的下界,同时也被管理区分配器作为阈值使用。
  • pages_high:回收页框使用的上界,同时也被管理区分配器作为阈值使用。
  • lowmem_res

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行