一、 Linux使用了三层内存映射机制。
为了在不同的CPU上实现内存管理,Linux设计了一种通用的内存管理模型。即:页面目录(PGD),中间目录(PMD),页面表(PT)三层。PT中的表项称为PTE(Page Table Entry)。三者均为数组。相应的,在逻辑上把线性地址从高位到低位划分为4个位段,分别为:PGD中的下标,PMD中的下标,页面表中的下标,以及物理页面内的位移。示意图如下:
下面通过代码来具体说明linux的内存映射机制。下面的代码都已i386 cpu(老的两层结构)来说明。
==================== include/asm-i386/pgtable-2level.h 4 18 ====================
4 /*
5 * traditional i386 two-level paging structure:
6 */
7
8 #define PGDIR_SHIFT 22 //线性地址中PGD下标位段的起始地址,此处定义为22,即bit22(第23位)
9 #define PTRS_PER_PGD 1024
10
11 /*
12 * the i386 is two-level, so we don't really have any
13 * PMD directory physically.
14 */
15 #define PMD_SHIFT 22
16 #define PTRS_PER_PMD 1
17
18 #define PTRS_PER_PTE 1024