Linux物理内存管理:page、zone、node

基本概念

  1. 页:struct page ,如下图所示,x86架构下一般为4K为大小

  1. 分区:struct zone ,如下图所示,x86架构下分为三个区 ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM

  1. 内存节点:struct node。对于一个简单的嵌入式系统只有一个node,对于大型服务器而言,有成千上万个CPU,这样肯定有成千上万个node,每个cpu都可以访问自己的内存,同时也可以通过总线访问其他内存。

Linux物理内存管理:page、zone、node_第1张图片

x86架构内存分布

  1. ZONE_DMA,一般由于内存碎片,有可能申请不到连续的一片物理内存,而DMA需要连续的物理内存,所以在X86下给DMA大概会留一块连续的16M的物理内存。

物理页:struct page

include/linux/mm_types.h

  1. struct page 用来描述物理页

可以看到,struct page 这个结构体中是由很多union 结构体组成的,为什么要这样操作呢?

1.因为union 是共享内存空间的,定义出那个类型的内存,就使用那个类型的内存空间。而这个page实际上是可以表示很多类型的内存的,比如,page cache 表示我们的缓存,anonymous page 表示我们申请的普通的匿名页,还有一些小块内存 slab,slub等等,这样做就可以节省很多内存。

include/asm-generic/memory_model.h

#define __pfn_to_page(pfn) (mem_map + ((pfn) - ARCH_PFN_OFFSET))

#define __page_to_pfn(page) ((unsigned long)((page) - mem_map) + ARCH_PFN_OFFSET)

pfn : 代表物理页帧号

mem_map : 是一个全局指针,指向 struct page

内存区域:struct zone

  1. 定义:include/linux/mmzone.h

  1. 初始化:arch/arm/mm/init.c zone_sizes_init(...) 函数中进行初始化的

  1. struct zone

你可能感兴趣的:(#,内存管理,linux)