深入linux内核架构--内存管理

本文探讨了Linux内核的内存管理体系,包括UMA和NUMA架构的区别,重点介绍了NUMA系统。文章详细阐述了内核空间的内存组织,如内存节点、内存域和页表,并讲解了内存初始化管理的过程,如建立zonelists和分配页面到伙伴系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内存体系结构

1. UMA VS NUMA

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

1)UMA(uniform memory access)计算机,将内存以连续的方式组织起来。SMP系统中每个处理器都是访问同一块内存。

2)NUMA(non-uniform memory access)计算机,总是多处理器计算机,系统各个CPU有各自本地的内存访问,各个处理器之间的总线是连着的,可以访问其他CPU,但是要慢一些。

UMA总线逻辑更简单,但是访问速度要慢,带宽低;NUMA总线逻辑更复杂,但是访问更高效,带宽高,也更容易伸缩。UMA更适合分时系统,NUMA更适合实时系统,UMA并行能力特别差。下面我们讲解的主要是NUMA系统,因为弄懂了NUMA系统的内存管理,UMA就特别容易理解了。

【推荐阅读】

一文了解linux内核对设备树的处理

Linux内核CPU调度域内容讲解

Linux内核源码分析--内核启动之zImage自解压过程

谈一谈关于Linux内核编译详解原理

你应该知道的Linux内核基础及内核编译

2. 内核空间-内存组织

  1. 内存划分为节点(pg_data_t),每个节点关联到系统中的一个处理器

每个节点有划分成内存域(zone),目前内存域分为四种:(三个内核内存域,一个用户内存域)ZONE_DMA/ZONE_DMA32,ZONE_NORMAL,ZONE_HIGHMEM。通过划分内存域可以更好的管理,针对不同的场景进行更好的优化。

· ZONE_DMA标记适合DMA的内存域,在IA-32计算机上,一般的现在是16MB,该区域供I/O设备直接访问,不需要通过MMU管理,连续分配,具有更高的性能。

· ZONE_DMA32,标记了使用32位地址可寻址、适合DMA的内存域,显然只有64位系统上,才会有该内存域。

· ZONE_NORMAL,可以直接映射到内核段的普通内存域,这是所有体系机构上保证都会存在的唯一内存域,在IA-32系统上,该域可访问的最大内存不超过896MiB,超过该值的内存只能能通过高端内存寻址访问ZONE_HIGHMEM中的内存。

· ZONE_HIGHMEM,超出了内核段的物理内存。只有在可用物理内存多余可映射的内核内存时,才会访问该域,显然一般只有32位系统上才会有可能有该区域。通过kmap及kunmap将该域内存映射到内核虚拟地址空间。

· ZONE_MOVEABLE,这个区域主要是给用户空间分配使用。

前三个zone主要为内核所用到,最后一个主要被用户空间用到,内核空间内存域具体划分见下图:

内核空间内存域zone划分

由于内核核心不依赖于高端内存,所以一般优先分配高端内存,高端内存分配完毕后才会分配普通内存。

内存组织结构见下图:

NUMA系统中的内存划分

数据结构如下:

 enum zone_type {
#ifdef CONFIG_ZONE_DMA
    ZONE_DMA,
#endif
#ifdef CONFIG_ZONE_DMA32
    ZONE_DMA32,
#endif
    ZONE_NORMAL,
#ifdef CONFIG_HIGHMEM
    ZONE_HIGHMEM,
#endif
    ZONE_MOVABLE,
#ifdef CONFIG_ZONE_DEVICE
    ZONE_DEVICE,
#endif
    __MAX_NR_ZONES
};
typedef struct pglist_data {
    struct zone node_zones[MAX_NR_ZONES]; /*内存域*/
    struct zonelist node_zonelists[MAX_ZONELISTS]; /* 备域(NUMA备用节点) */
    int nr_zones; /* 内存域数目 */
#ifdef CONFIG_FLAT_NODE_MEM_MAP /* means !SPARSEMEM */
    struct page *node_mem_map;  /* 所有内存域中的页 */
#ifdef CONFIG_PAGE_EXTENSION
    struct page_ext *node_page_ext; /* 内存页的更多描述信息*/
#endif
#endif
    unsigned long node_start_pfn; /* 节点起始页帧编号(系统中的所有节点的页帧编号唯一) */
    unsigned long node_present_pages; /* total number of physical pages */
    unsigned long node_spanned_pages; /* total size of physical page
                         range, including hol
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值