#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 pgprot { pgprotval_t pgprot; } pgprot_t; typedef struct { pgdval_t pgd; } pgd_t; //write val to pgd_t static inline pgd_t native_make_pgd(pgdval_t val) { return (pgd_t) { val }; } //read pgd_t pgd:pgdval_t static inline pgdval_t native_pgd_val(pgd_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))) {/** ...
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...
我们很容易从一些Linux内核的书籍中知道X86架构使用2级( 10-10-12 )页表,X86-64架构使用4级( 9-9-9-9-12 )页表甚至是5级(在pgd_t与pud_t中间加了一层p4d_t),但是一些隐藏的问题却往往被忽略,如每一个进程的页表存储在内核空间吗?为什么内核中页表所在页框物理地址转化为虚拟地址只需要加个偏置 PAGE_OF...
可以看出Linux系统中每个进程的页面目录的第二部分是相同的,所以从进程的角度来看,每个进程有4G字节的虚拟空间,较低的3G字节是自己的用户空间,最高的1G字节则为与所有进程以及内核共享的系统空间。每个进程有它自己的PGD( Page Global Directory),它是一个物理页,并包含一个pgd_t数组。
ARM32中PGD定义 下面是First-level descriptor详细说明: /* * Hardware page table definitions. * * + Level 1 descriptor (PMD) * - common */ #define PMD_TYPE_MASK (_AT(pmdval_t, 3) << 0)---01对应PageTable #define PMD_TYPE_FAULT (_AT(pmdval...
pgd_t*pgd;//指向页全局目录atomic_t mm_users;//用户空间中有多少用户atomic_t mm_count;//对"struct mm_struct"有多少引用int map_count;//虚拟区间的个数struct rw_semaphore mmap_sem;spinlock_t page_table_lock;//保护任务页表和mm->rssstruct list_head mmlist;//所有活动mm的链表mm_counter_t ...
staticinlinep4d_t*p4d_offset(pgd_t*pgd,unsignedlongaddress){if(!pgtable_l5_enabled())return(p4d...
可以看出Linux系统中每个进程的页面目录的第二部分是相同的,所以从进程的角度来看,每个进程有4G字节的虚拟空间,较低的3G字节是自己的用户空间,最高的1G字节则为与所有进程以及内核共享的系统空间。每个进程有它自己的PGD( Page Global Directory),它是一个物理页,并包含一个pgd_t数组。