4.一是填充pgd entry,二是创建后续的pud translation table(如果需要的话)并进行下游Translation table的建立,对于ARM32 ,该PGD表项不存在,所以只会执行一次,接下来创建下一级页表。对于4级页表的处理器,这个会创建PGD的表项。 首先我们来看看,pdg_offset,入参是mm和addr,获去所属的页面目录项PGD,内核的页表存...
#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1)) /* * pgd_offset() returns a (pgd_t *) * pgd_index() is used get the offset into the pgd page's array of pgd_t's; */ #define pgd_offset(mm, address) ((mm)->pgd + pgd_index((address)))...
通过pgd_offset计算页面全局编录条目的线性地址pgd,并传入内存描述符mm和线性地址vaddr。接下来,打印pgd指向的页面全局编录条目。 通过pud_offset计算页面父目录条目的线性地址pud,并将参数传递给页面全局目录条目的线性地址pgd和线性地址vaddr。然后打印指向父目录条目的pud。 通过pmd_offset计算页面中间目录条目的线性地址...
#definepgd_offset_k(addr)pgd_offset(&init_mm,addr)//由虚拟地址来获取内核页表的PGD页表的相应的页表项 #definepgd_offset(mm,addr)((mm)->pgd+pgd_index(addr))//由虚拟地址来获取用户进程的页表中相应的PGD表项 pgd_index(addr)//由虚拟地址找到PGD页表的索引 pte_index(addr)//由虚拟地址找到PT页...
pgd_offset该函数返回线性地址address在页全局目录中对应表项的线性地址。mm为指向一个内存描述符的指针,address为要转换的线性地址。该宏最终返回address在页全局目录中相应表项的线性地址。 #define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1)) ...
关键词:swapper_pd_dir、ARM PGD/PTE、Linux PGD/PTE、pgd_offset_k。 Linux下的页表映射分为两种,一是Linux自身的页表映射,另一种是ARM32 MMU硬件的映射。 1. ARM32页表映射 由于ARM32和Linux内核维护的页表项有所不同,所以维护了两套PTE。 PGD存放在swapper_pd_dir中,一个PGD目录项其实包含了两份ARM32 ...
pgd_offset_k(addr) ,获取 addr 地址对应pgd全局页表中的 entry ,而这个pgd全局页表正是 swapper_pg_dir 全局页表; 将bm_pud 的物理地址写到pgd全局页目录表中; 将bm_pmd 的物理地址写到pud页目录表中; 将bm_pte 的物理地址写到pmd页表目录表中; ...
create_pgd_entryx0,x3,x5,x6 movx5,x3//__pa(__idmap_text_start) adr_lx6,__idmap_text_end//__pa(__idmap_text_end) create_block_mapx0,x7,x3,x5,x6 /* *Mapthekernelimage(startingwithPHYS_OFFSET). */ adrpx0,swapper_pg_dir ...
* Map the kernel image (starting with PHYS_OFFSET). */ adrp x0, swapper_pg_dir mov_q x5, KIMAGE_VADDR + TEXT_OFFSET // compile time __va(_text) add x5, x5, x23 // add KASLR displacement create_pgd_entry x0, x5, x3, x6 ...
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_...