typedef struct { pgdval_t pgd; } pgd_t; static inline pgd_t native_make_pgd(pgdval_t val) { return (pgd_t) { val }; } static inline pgdval_t native_pgd_val(pgd_t pgd) { return pgd.pgd; } static inline pgdval_t pgd_flags(pgd_t pgd) { return native_pgd_val(pgd) & PTE...
#define pgd_offset(mm, address) ((mm)->pgd+pgd_index(address)) #define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1)) pmd_offset():输入一个PGD项(找到页框地址)和一个线性地址(找到pmd的偏移),返回一个对应的PMD #define pmd_offset(dir, address) ((pmd_t *) ...
typedef struct{pgdval_t pgd;}pgd_t;staticinline pgd_tnative_make_pgd(pgdval_t val){return(pgd_t){val};}staticinline pgdval_tnative_pgd_val(pgd_t pgd){returnpgd.pgd;}staticinline pgdval_tpgd_flags(pgd_t pgd){returnnative_pgd_val(pgd)&PTE_FLAGS_MASK;}#ifCONFIG_PGTABLE_LEVELS>3ty...
2.1.2 pgd_t、pmd_t、pud_t和pte_t 参照/arch/x86/include/asm/pgtable_types.h typedefstruct{pgdval_tpgd; }pgd_t;staticinlinepgd_tnative_make_pgd(pgdval_tval){return(pgd_t) { val }; }staticinlinepgdval_tnative_pgd_val(pgd_tpgd){returnpgd.pgd; }staticinlinepgdval_tpgd_flags(pgd_...
页面目录PGD、中间目录PMD和页面表PT分别是由表项pgd_t、pmd_t和pte_t构成的数组,而这些表项都是数据结构 1 /* 2 * These are used to make use of C type-checking.. 3 */ 4 #if CONFIG_X86_PAE 5 typ
pgd_t *pgd; pmd_t *u_pmds[MAX_PREALLOCATED_USER_PMDS]; pmd_t *pmds[MAX_PREALLOCATED_PMDS]; //PGD 分配: pgd = _pgd_alloc;//调用 _pgd_alloc 函数分配一个新的 PGD。如果分配失败,跳转到 out 标签. if (pgd == NULL) goto out; ...
PUD_SHIFT 用来表示 PUD 中的一个页目录项 pud_t 可以映射的物理内存大小(1G)。 PGD_SHIFT 用来表示 PGD 中的一个页目录项 pgd_t 可以映射的物理内存大小(512G)。 这些XXX_SHIFT 常量在内核中除了可以表示对应页目录项映射的物理内存大小之外,还可以从一个 64 位虚拟内存地址中获取其在对应页目录中的偏移。
可能正是因为页表大小(1K)与页大小(4K)的不匹配,也造成了内存映射计算方面的很多麻烦。直观地来理解,既然每一个一级页表项映射的内存空间是1M,那么在代码中一个一级页表项pgd_t的大小就应该定义为4字节,PGDIR_SIZE应该定义为1M,但事实不是这样: [c]#define PGDIR_SHIFT 21#define PGDIR_SIZE (1UL << ...
三级页表由不同的数据结构表示,它们分别是pgd_t,pmd_t和pte_t。注意到它们均被定义为unsigned long类型,也即大小为4bytes,32bits。 12.2. 一级页表 三级页表由不同的的数据结构表示,它们分别是pgd_t,pmd_t和pte_t。注意到它们均被定义为unsigned long类型,也即大小为4bytes,32bits。
每个进程有它自己的PGD( Page Global Directory),它是一个物理页,并包含一个pgd_t数组。其定义见<asm/page.h>。 进程的pgd_t数据见 task_struct -> mm_struct -> pgd_t * pgd; ARM架构的PGD和PMD的定义如下<arch/arm/include/asm/pgtable.h>: ...