转自:http://blog.csdn.net/myarrow/article/details/8624687
1. Linux物理内存三级架构
对于内存管理,Linux采用了与具体体系架构不相关的设计模型,实现了良好的可伸缩性。它主要由内存节点node、内存区域zone和物理页框page三级架构组成。
? 内存节点node
内存节点node是计算机系统中对物理内存的一种描述方法,一个总线主设备访问位于同一个节点中的任意内存单元所花的代价相同,而访问任意两个不同节点中的内存单元所花的代价不同。在一致存储结构(Uniform Memory Architecture,简称UMA)计算机系统中只有一个节点,而在非一致性存储结构(NUMA)计算机系统中有多个节点。Linux内核中使用数据结构pg_data_t来表示内存节点node。如常用的ARM架构为UMA架构。
? 内存区域zone
内存区域位于同一个内存节点之内,由于各种原因它们的用途和使用方法并不一样。如基于IA32体系结构的个人计算机系统中,由于历史原因使得ISA设备只能使用最低16MB来进行DMA传输。又如,由于Linux内核采用
? 物理页框page
2. Linux虚拟内存三级页表
Linux虚拟内存三级管理由以下三级组成:
? PGD: Page Global Directory (页目录)
? PMD: Page Middle Directory (页目录)
? PTE: Page Table Entry (页表项)
每一级有以下三个关键描述宏:
? SHIFT
? SIZE
? MASK
如页的对应描述为:
/* PAGE_SHIFT determines the page size asm/page.h */
#define PAGE_SHIFT 12
#define PAGE_SIZE (_AC(1,UL) <
#define PAGE_MASK (~(PAGE_SIZE-1))
数据结构定义如下:
/* asm/page.h */
typedefunsignedlongpteval_t;
typedefpteval_t pte_t;
typedefunsignedlongpmd_t;
typedefunsignedlongpgd_t[2];
typedefunsignedlongpgprot_t;
#define pte_val(x) (x)
#define pmd_val(x) (x)
#define pgd_val(x) ((x)[0])
#define pgprot_val(x) (x)
#define __pte(x) (x)
#define __pmd(x) (x)
#define __pgprot(x) (x)
2.1 Page Directory (PGD and PMD)
每个进程有它自己的PGD( Page Global Directory),它是一个物理页,并包含一个pgd_t数组。其定义见。 进程的pgd_t数据见 task_struct -> mm_struct -> pgd_t * pgd;
ARM架构的PGD和PMD的定义如下:
#define PTRS_PER_PTE 512// PTE中可包含的指针数 (21-12=9bit)
#define PTRS_PER_PMD 1
#define PTRS_PER_PGD 2048 // PGD中可包含的指针数 (32-21=11bit)
#define PTE_HWTABLE_PTRS (PTRS_PER_PTE)
#define PTE_HWTABLE_O