内核定义了结构体 pgd_t 来表示全局页目录项;结构体 pud_t 表示上层页目录项;结构体pmd_t 表示中层页目录项;结构体pte_t 表示页表项。 除了各级表项外,页属性本质上也是一个 64 位的数据,可以使用基本类型来表示。类似的,内核定义了结构体 pgprot_t 来对页属性进行包装。 // file: arch/x86/include/asm...
{returnpte.pte;}staticinline pteval_tpte_flags(pte_t pte){returnnative_pte_val(pte)&PTE_FLAGS_MASK;} 2.1.3 xxx_val和__xxx 参照/arch/x86/include/asm/pgtable.h 五个类型转换宏(_ pte、_ pmd、_ pud、_ pgd和__ pgprot)把一个无符号整数转换成所需的类型。 另外的五个类型转换宏(pte_val...
2.2 Page Table Entry PTEs, PMDs和PGDs分别由pte_t, pmd_t 和pgd_t来描述。为了存储保护位,pgprot_t被定义,它拥有相关的flags并经常被存储在page table entry低位(lower bits),其具体的存储方式依赖于CPU架构。 每个pte_t指向一个物理页的地址,并且所有的地址都是页对齐的。因此在32位地址中有PAGE_SHIFT(12...
pgprot_t vm_get_page_prot(unsigned long vm_flags) { return __pgprot(pgprot_val(protection_map[vm_flags & (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]) | pgprot_val(arch_vm_get_page_prot(vm_flags))); } 属性也需要转换,文章一开始就提到过,只有写引发缺页异常之后,才会真正把页属性配置为可写。
一个页面保护结构 pgprot_t 和一些宏,字段 pgprot 的值与图 2.24 页面项的低 12 位相对应,其中的 9 位对应 0~9 位: 代码语言:javascript 代码运行次数:0 运行 AI代码解释 typedef struct{unsigned long pgprot;}pgprot_t;#define pgprot_val(x) ((x).pgprot) ...
pgprot_t vm_page_prot; unsigned long vm_flags; } 我们可以通过 mmap 系统调用中的参数 prot 来指定其在进程虚拟内存空间中映射出的这段虚拟内存区域 VMA 的访问权限,它的取值有如下四种: #define PROT_READ 0x1 /* page can be read */ #define PROT_WRITE 0x2 /* page can be written */ ...
mm_struct结构体 是 " 进程的用户虚拟地址空间 " , 又称为 " 内存描述符 " ; 代码语言:javascript 代码运行次数:0 运行 AI代码解释 struct mm_struct*vm_mm;/* The address space we belong to. */ 2、vm_page_prot 成员 pgprot_t vm_page_prot成员是 控制访问权限 的 " 保护位 " , ...
unsignedlongpfn,pgprot_tprot) { pte_t*pte,*mapped_pte; spinlock_t*ptl; interr=0; mapped_pte=pte=pte_alloc_map_lock(mm,pmd,addr,&ptl);//寻找相应的pte页表项。注意这里需要申请一个spinlock锁用来保护修改pte页表 if(!pte) return-ENOMEM; ...
*/void*__vmalloc_node_range(unsignedlongsize,unsignedlongalign,unsignedlongstart,unsignedlongend,gfp_tgfp_mask,pgprot_tprot,unsignedlongvm_flags,intnode,constvoid*caller) {// 用于描述 vmalloc 虚拟内存区域的数据结构,同 mmap 中的 vma 结构很相似structvm_struct*area;// vmalloc 虚拟内存区域的起始地...
unsignedlongpfn, unsignedlongsize, pgprot_t prot) { pgd_t*pgd; unsignedlongnext;/*需要映射的虚拟地址尾部:注意要页对齐,因为cpu硬件是以页为单位管理内存的*/unsignedlongend = addr +PAGE_ALIGN(size);structmm_struct *mm = vma->vm_mm;