通过pgd_offset计算页面全局编录条目的线性地址pgd,并传入内存描述符mm和线性地址vaddr。接下来,打印pgd指向的页面全局编录条目。 通过pud_offset计算页面父目录条目的线性地址pud,并将参数传递给页面全局目录条目的线性地址pgd和线性地址vaddr。然后打印指向父目录条目的pud。 通过pmd_offset计算页面中间目录条目的线性地址...
我们以pgd_offset为例进行说明。 宏 pgd_offset接收2 个参数: mm_struct结构体指针 需要计算的虚拟地址 从4.2.2 小节可以知道,每个进程的内存描述符 mm_struct 中有一个字段 pgd 指向进程使用的全局页目录。所以,在 pgd_offset 中,使用 (mm)->pgd获取到全局页目录的基地址,使用 pgd_index((address))获取到...
首先通过pgd_offset在第一层页面目录中找到起始地址所属的目录项,然后通过一个do-while循环从这个目录项开始处理涉及的所有目录项。 /* to find an entry in a page-table-directory. */ #define pgd_index(address) ((address >> PGDIR_SHIFT) & (PTRS_PER_PGD-1)) #define __pgd_offset(address) pgd...
pgd_offset_k 将虚拟地址进行转换得到PMD的指针。 #definePGDIR_SHIFT 21/*to find an entry in a page-table-directory*/#definepgd_index(addr) ((addr) >> PGDIR_SHIFT)#definepgd_offset(mm, addr) ((mm)->pgd + pgd_index(addr))#definepgd_offset_k(addr) pgd_offset(&init_mm, addr)struct...
pgd_offset_k(addr) ,获取 addr 地址对应pgd全局页表中的 entry ,而这个pgd全局页表正是 swapper_pg_dir 全局页表; 将bm_pud 的物理地址写到pgd全局页目录表中; 将bm_pmd 的物理地址写到pud页目录表中; 将bm_pte 的物理地址写到pmd页表目录表中; ...
#definepgd_offset_k(addr)pgd_offset(&init_mm,addr)//由虚拟地址来获取内核页表的PGD页表的相应的页表项 #definepgd_offset(mm,addr)((mm)->pgd+pgd_index(addr))//由虚拟地址来获取用户进程的页表中相应的PGD表项 pgd_index(addr)//由虚拟地址找到PGD页表的索引 ...
pgd = pgd_offset(mm, address); p4d = p4d_alloc(mm, pgd, address); ... // 上层页表 vmf.pud = pud_alloc(mm, p4d, address); ... // 中间层页表 vmf.pmd = pmd_alloc(mm, vmf.pud, address); ... return handle_pte_fault(&vmf); } handle_pte_...
create_pgd_entry x0, x3, x5, x6 mov x5, x3 // __pa(__idmap_text_start) adr_l x6, __idmap_text_end // __pa(__idmap_text_end) create_block_map x0, x7, x3, x5, x6 /* * Map the kernel image (starting with PHYS_OFFSET). ...
pd = pmd_offset(pud_offset(pgd_offset_k(va), va), va); /* Use middle 10 bits of VA to index the second-level map */ pg = pte_alloc_kernel(pd, va); if (pg != 0) { err = 0; /* The PTE should never be already set nor present in the ...
void__initearly_fixmap_init(void){pgd_t*pgdp;p4d_t*p4dp,p4d;pud_t*pudp;pmd_t*pmdp;unsignedlongaddr=FIXADDR_START;pgdp=pgd_offset_k(addr);///获得pgd页表项p4dp=p4d_offset(pgdp,addr);p4d=READ_ONCE(*p4dp);if(CONFIG_PGTABLE_LEVELS>3&&!(p4d_none(p4d)||p4d_page_paddr(p4d)==__...