#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 *) ...
void __init early_fixmap_init(void){pgd_t *pgd;pud_t *pud;pmd_t *pmd;unsigned long addr = FIXADDR_START; /* (1) */ pgd = pgd_offset_k(addr); /* (2) */if (CONFIG_PGTABLE_LEVELS > 3 &&!(pgd_none(*pgd) || pgd_page_paddr(*pgd) == __pa_symbol(bm_pud))) {/** ...
linux 内核源代码情景分析——几个重要的数据结构和函数 页面目录PGD、中间目录PMD和页面表PT分别是由表项pgd_t、pmd_t和pte_t构成的数组,而这些表项都是数据结构 1/*2* These are used to make use of C type-checking..3*/4#ifCONFIG_X86_PAE5typedefstruct{ unsignedlongpte_low, pte_high; } pte_...
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...
2.1.2 pgd_t、pmd_t、pud_t和pte_t 参照/arch/x86/include/asm/pgtable_types.h 代码语言:javascript 复制 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...
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; ...
PMD_SHIFT 用来表示 PMD 中的一个页目录项 pmd_t 可以映射的物理内存大小(2M)。 PUD_SHIFT 用来表示 PUD 中的一个页目录项 pud_t 可以映射的物理内存大小(1G)。 PGD_SHIFT 用来表示 PGD 中的一个页目录项 pgd_t 可以映射的物理内存大小(512G)。
__pgd(__pa(swapper_pg_dir) + sizeof(pgd_t)); set_kernel_vm90_perms(); swapper_pg_dir[PTRS_PER_PGD - 1] = pgd; write_cr3(__pa(swapper_pg_dir)); pgtable_cache_init(); } 在该函数中,主要进行了一下几个步骤: 1. 分配一个页作为swapper页目录(swapper_pg_dir),并将内核初始页目...
步骤1:查询pgd表 查询pgd表,首先需要找到pgd表物理页首地址,pgd表物理页首地址由task_struct->mm_struct->pgd成员保存,每个进程的task_struct->mm_struct->pgd成员数值不同,所以不同的进程即使使用相同的虚拟地址也不会访问相同到物理地址。 通过pgd表首地址+虚拟地址pgd表偏移索引到pgd_t表项完成pgd表查询。步...
第一次读取内存得到pgd_t结构的目录项,从中取出物理页基址取出,即页上级页目录的物理基地址。 从线性地址的第二部分中取出页上级目录项的索引,与页上级目录基地址相加得到页上级目录项的物理地址。 第二次读取内存得到pud_t结构的目录项,从中取出页中间目录的物理基地址。