32bit的Linux采用三级映射:PGD-->PMD-->PTE,64bit的Linux采用四级映射:PGD-->PUD-->PMD-->PTE,多了个PUD。 缩写是PGD:Page Global Directory、PUD:Page Upper Directory、PMD:Page Middle Directory、PTE:Page Table Entry。 在ARM32 Linux采用两层映射,省略了PMD,除非在定义了CONFIG_ARM_LPAE才会使用3级映射。
.prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | L_PTE_XN, .prot_l1 = PMD_TYPE_TABLE, .domain = DOMAIN_KERNEL, }, } create_mapping的参数是struct map_desc类型,用于描述一个虚拟地址区域线性映射到物理区域。基于这块区域创建PGD/PTE,下面我们就进入map_lowmem。 static void __init...
ARM架构的PGD和PMD的定义如下<arch/arm/include/asm/pgtable.h>: #definePTRS_PER_PTE 512// PTE中可包含的指针数 (21-12=9bit) #define PTRS_PER_PMD 1 #define PTRS_PER_PGD 2048 // PGD中可包含的指针数 (32-21=11bit)#definePTE_HWTABLE_PTRS (PTRS_PER_PTE) #definePTE_HWTABLE_OFF (PTE_...
32bit的Linux采用三级映射:PGD-->PMD-->PTE,64bit的Linux采用四级映射:PGD-->PUD-->PMD-->PTE,多了个PUD。 缩写是PGD:Page Global Directory、PUD:Page Upper Directory、PMD:Page Middle Directory、PTE:Page Table Entry。 在ARM32 Linux采用两层映射,省略了PMD,除非在定义了CONFIG_ARM_LPAE才会使用3级映射。
PTE: 页表项(page table entry) PGD(Page Global Directory) PUD(Page Upper Directory) PMD(Page Middle Directory) PT(Page Table) PGD中包含若干PUD的地址,PUD中包含若干PMD的地址,PMD中又包含若干PT的地址。每一个页表项指向一个页框,页框就是真正的物理内存页。
PTE: 页表项(page table entry) PGD(Page Global Directory) PUD(Page Upper Directory) PMD(Page Middle Directory) PT(Page Table) PGD中包含若干PUD的地址,PUD中包含若干PMD的地址,PMD中又包含若干PT的地址。每一个页表项指向一个页框,页框就是真正的物理内存页。
首先无论是几级页表,它们通过虚拟内存寻址的本质就是定位虚拟内存页对应在页表中的 PTE,然后通过 PTE 找到其映射的具体物理内存页。 页表的本质是一个物理内存页,其中包含了 1024 个 PTE,每个 PTE 可以映射一个具体的物理内存页,PTE 中保存了物理内存页的起始地址,进程地址空间中的一个虚拟内存页对应页表中的一...
PGD中包含若干PUD的地址,PUD中包含若干PMD的地址,PMD中又包含若干PT的地址。每一个PTE页表项指向一个页框,也就是一个实际的物理页面。 1.4 页表带来的问题 虽然16K的页表数据支持起了256T的地址空间寻址。但是,这也带来了额外的问题,页表是存在内存里的。那就是一次内存IO光是虚拟地址到物理地址的转换就要去内存...
typedef struct{unsigned long pgd;}pgd_t;/* 顶级页表目录 */ typedef struct{unsigned long pud;}pud_t;/* 高层页表目录 */ typedef struct{unsigned long pmd;}pmd_t;/* 中层页表目录 */ typedef struct{unsigned long pte;}pte_t;/* 最底层页表条目 */2.对页表的基本操作 ...
上面是ARMv8所支持的页表分级策略,下面介绍在Linux内核代码中的具体实现。ARMv8支持4级页表分别是PGD->PUD->PMD->PTE,3级页表情况下,没有PGD页表;2级页表情况下,没有PGD和PUD。 从代码中看Linux的启动过程(arch/arm64/kernel/head.S): 代码语言:javascript ...