如果相应的表项值为0,那么,宏pte_none、pmd_none、pud_none和 pgd_none产生的值为1,否则产生的值为0。 宏pte_clear、pmd_clear、pud_clear和 pgd_clear清除相应页表的一个表项,由此禁止进程使用由该页表项映射的线性地址。ptep_get_and_clear( )函数清除一个页表项并返回前一个值。 set_pte,set_pmd,set...
entry = pte_mkwrite(pte_mkdirty(entry)); /*把page_table指向虚拟地址addr的二级页表条目地址*/ page_table = pte_offset_map_lock(mm, pmd, address, &ptl); /*如果这个缺页的虚拟地址对应的二级页表条目所映射的内容居然在内存中,报错返回*/ if (!pte_none(*page_table)) goto release; /*mm的rs...
pmd中填入的pmd描述符包含两部分信息:1.二级页表(pte table)的base address.2.flag。pmd的矫正也就是矫正这两部分的过程。 pmd为none,则内核通过__pte_alloc首先分配一个page来作为pte table使用,然后经过计算组织成pmd描述符填入到pmd table中。 如果一级页表条目不为空,那就接着再调用handle_pte_fault进行pte...
1.1 kmalloc函数 Kmalloc分配的是连续的物理地址空间。如果需要连续的物理页,可以使用此函数,这是内核中内存分配的常用方式,也是大多数情况下应该使用的内存分配方式。 传递给函数的最常用的标志是GTP_ATOMIC和GTP_KERNEL。前面的标志表示进行不睡眠的高优先级分配。在中断处理程序和其他不能睡眠的代码段中需要。后面的...
}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/pgtable.h 五个类型转换宏(_ pte、_ pmd、_ pud、_ pgd和__ pgprot)把一个无符号整...
pte_offset_kernel(pmd,addr)//查找内核页表中对应的PT页表的表项 判断页表项的状态 #definepte_none(pte)(!pte_val(pte))//pte是否存在 #definepte_present(pte)(pte_isset((pte),L_PTE_PRESENT))//present比特位 #definepte_valid(pte)(pte_isset((pte),L_PTE_VALID))//pte是否有效 ...
static inline u64 flip_protnone_guard(u64 oldval, u64 val, u64 mask) { return val; } static inline bool __pte_needs_invert(u64 val) { return false; }4.x86 架构相关的三级页表操作 源码:arch/x86/include/asm/pgtable-3level.h ...
if(pmd_none(*pmd_tmp)){ printk(KERN_INFO"Not mapped in pmd.\n"); return 0; } //在这里,把原来的pte_offset_map改成了pte_offset_kernel pte_tmp = pte_offset_kernel(pmd_tmp,va); //pte指的是 找到表 printk(KERN_INFO"pte_tmp = 0x%p\n",pte_tmp); ...
}//在这里,把原来的pte_offset_map()改成了pte_offset_kernelpte_tmp =pte_offset_kernel(pmd_tmp,va);//pte指的是 找到表printk(KERN_INFO"pte_tmp = 0x%p\n",pte_tmp);printk(KERN_INFO"pte_val(*pte_tmp) = 0x%lx\n",pte_val(*pte_tmp));if(pte_none(*pte_tmp)){//判断有没有映射pri...
1)如果相应的表项值为0,那么,宏pte_none、pmd_none、pud_none和 pgd_none产生的值为1,否则产生的值为0。 2)宏pte_clear、pmd_clear、pud_clear和 pgd_clear清除相应页表的一个表项,由此禁止进程使用由该页表项映射的线性地址。ptep_get_and_clear( )函数清除一个页表项并返回前一个值。