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...
每个pte_t指向一个物理页的地址,并且所有的地址都是页对齐的。因此在32位地址中有PAGE_SHIFT(12)位是空闲的,它可以为PTE的状态位。 PTE的保护和状态位如下图所示: 2.3 如何通过3级页表访问物理内存 为了通过PGD、PMD和PTE访问物理内存,其相关宏在asm/pgtable.h中定义。 • pgd_offset 根据当前虚拟地址和当...
}staticinlinepte_tnative_make_pte(pteval_tval){return(pte_t) { .pte = val }; }staticinlinepteval_tnative_pte_val(pte_tpte){returnpte.pte; }staticinlinepteval_tpte_flags(pte_tpte){returnnative_pte_val(pte) & PTE_FLAGS_MASK; } 2.1.3 xxx_val和__xxx 参照/arch/x86/include/asm/...
static inline pte_t native_make_pte(pteval_t val) { return (pte_t) { .pte = val }; } static inline pteval_t native_pte_val(pte_t pte) { return pte.pte; } static inline pteval_t pte_flags(pte_t pte) { return native_pte_val(pte) & PTE_FLAGS_MASK; } (3)xxx_val和__xx...
第四次读取内存得到pte_t结构的目录项,从中取出物理页的基地址。 从线性地址的第五部分中取出物理页内偏移量,与物理页基址相加得到最终的物理地址。 第五次读取内存得到最终要访问的数据。 整个过程是比较机械的,每次转换先获取物理页基地址,再从线性地址中获取索引,合成物理地址后再访问内存。不管是页表还是要访问...
pte_t pte; struct shmid_kernel *shp; unsigned int idx; struct page * page; shp = *(struct shmid_kernel **) shmd->vm_private_data; idx = (address - shmd->vm_start + shmd->vm_offset) >> PAGE_SHIFT; spin_lock(&shm_lock); ...
pte_t、pmd_t、pud_t和 pgd_t分别描述页表项、页中间目录项、页上级目录和页全局目录项的类型格式。当PAE被**时它们都是64位的数据类型,否则都是32位数据类型。pgprot_t是另一个64位(PAE**时)或32位(PAE禁用时)的数据类型,它表示与一个单独表项相关的保护标志。
//新增一个PTEpte_t trampoline_pte[PTRS_PER_PTE]__page_aligned_bss;create_pgd_mapping(trampoline_pg_dir,PAGE_OFFSET,(uintptr_t)trampoline_pmd,PGDIR_SIZE,PAGE_TABLE);create_pmd_mapping(trampoline_pmd,PAGE_OFFSET,(uintptr_t)trampoline_pte,PMD_SIZE,PAGE_TABLE);end_va=PAGE_OFFSET+PMD_SIZE;...
typedef struct { pteval_t pte; } pte_t; 1. 2. 3. 复制 下面是 PTE 中 32 bit (4 字节) 的布局格式: 由于内核将整个物理内存划分为一页一页的单位,每个物理内存页大小为 4K,所以物理内存页的起始地址都是按照 4K 对齐的,也就导致物理内存页的起始地址的后 12 位全部是 0,我们只需要在 PTE 中...
pte_addr_t direct }pte; unsigned long private; #if definde (WANT_PAGE_VIRTUAL) void *virtual;//指向页面的虚拟地址 #endif } <系统在内存中的分布示意图> a:4G进程地址空间解析 b:虚拟地址空间分配及其与物理内存对应图 其中kmalloc和vmalloc函数申请的空间对应着不同的区域,同时又不同的含义。