Linux内核分析--内存管理详解图(秒懂)

2023-02-20 00:00:00 内存 内核 分配 地址 进程

本文主要针对想从事linux内核开发的初级人员,由于内存管理是在从事内核开发时的基础知识,因此本文将从宏观原理方面阐述linux内核的内存管理机制。主要从内核空间和用户空间分析。

一、内核空间

1、页

页(page)是内核的内存管理基本单位。(linux/mm_*.h)
struct page {
unsigned long flags; // 页标志符
struct address_space *mapping; // 该页所在地址空间描述符结构指针
atomic_t _mapcount; // 页映射计数
..............................................................
} _struct_page_alignment;

  • flags:页标志包含是不是脏的,是否被锁定等等,每一位单独表示一种状态,可同时表示出32种不同状态,定义在<linux/page-flags.h>
  • _count:计数值为-1表示未被使用。
  • virtual:页在虚拟内存中的地址,对于不能映射到内核空间的内存(比如高端内存),该值为NULL;需要事必须动态映射这些内存。

尽管处理器的小可寻址单位通常为字或字节,但内存管理单元(MMU,把虚拟地址转换为物理地址的硬件设备)通常以页为单位处理。内核用struct page结构体表示每个物理页,struct page结构体占40个字节,假定系统物理页大小为4KB,对于4GB物理内存,1M个页面,故所有的页面page结构体共占有内存大小为40MB,相对系统4G,这个代价并不高。

2、区(zone)

内核把页划分在不同的区(zone)

总共3个区,具体如下:

  • 执行DMA操作的内存必须从ZONE_DMA区分配
  • 一般内存,既可从ZONE_DMA,也可从ZONE_NORMAL分配,但不能同时从两个区分配;

3、页分配与释放

下面列举所有的页为单位进行连续物理内存分配,也称为低级页分配器:

  • get_zeroed_page:对于用户空间,这个方法能保障系统敏感数据不会泄露
  • page_address: 把给定的页转换成逻辑地址

4、字节分配与释放

kmalloc,vmalloc分配都是以字节为单位

(1) kmalloc

void * kmalloc(size_t size, gfp_t flags)

相关文章