BUG_ON(!pte_none(*pte)); /*这是映射的最后一级:把物理地址的值填写到pte表项*/ set_pte_at(mm, addr, pte, pte_mkspecial(pfn_pte(pfn, prot))); pfn++; } while (pte++, addr += PAGE_SIZE, addr != end); arch_leave_lazy_mmu_mode(); pte_unmap_unlock(pte - 1, ptl); return ...
“set_pmd”函数和“set_pte”函数用来建立对应的映射关系。 static void __init kernel_physical_mapping_init(pgd_t *pgd_base) { unsigned long pfn; pgd_t *pgd; pmd_t *pmd; pte_t *pte; int pgd_idx, pmd_idx, pte_ofs; pgd_idx = pgd_index(PAGE_OFFSET); pgd = pgd_base + pgd_idx;...
set_pte,set_pmd,set_pud和set_pgd向一个页表项中写入指定的值。set_pte_atomic与set_pte作用相同,但是当PAE被激活时它同样能保证64位的值能被原子地写入。 如果a和b两个页表项指向同一页并且指定相同访问优先级,pte_same(a,b)返回1,否则返回0。 如果页中间目录项指向一个大型页(2MB或4MB),pmd_large(e...
set_pte,set_pmd,set_pud和set_pgd向一个页表项中写入指定的值。set_pte_atomic与set_pte作用相同,但是当PAE被激活时它同样能保证64位的值能被原子地写入。 如果a和b两个页表项指向同一页并且指定相同访问优先级,pte_same(a,b)返回1,否则返回0。 如果页中间目录项指向一个大型页(2MB或4MB),pmd_large(e...
1、如果是32位有高端地址的就需要调用set_pte通过内核页表进行临时映射; 2、如果是64位没有高端地址的,就调用page_address,里面会调用lowmen_page_address, 3、其实低端内存的映射,会直接使用_va进行临时映射 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 void *...
2)宏pte_clear、pmd_clear、pud_clear和 pgd_clear清除相应页表的一个表项,由此禁止进程使用由该页表项映射的线性地址。ptep_get_and_clear( )函数清除一个页表项并返回前一个值。 3)set_pte,set_pmd,set_pud和set_pgd向一个页表项中写入指定的值。set_pte_atomic与set_pte作用相同,但是当PAE被**时它同...
set_page_dirty(page); gotoset_swap_pte; out_unlock_restore: set_pte(page_table, pte); UnlockPage(page); return0; } 上面的代码中, 首先调用 get_swap_page 函数获取交换文件的一个槽(用于保存内存页的内容), 然后调用 add_to_swap_cache 函数把内存页添加到活跃链表中, add_to_swap_cache 函数...
flush_cache_page(vma,addr,pfn);set_pte(pte_pointer,new_pte_val);flush_tlb_page(vma,addr); 在修改或删除页表项以前必须冲刷缓存,因为从虚拟地址生成索引的缓存要求:从缓存冲刷虚拟地址的时候,虚拟地址到物理地址的映射必须存在。 内核提供的在修改页表前冲刷缓存的函数如下所示。所有处理器架构需要实现这些函...
if(pte_swp_soft_dirty(vmf->orig_pte)) pte = pte_mksoft_dirty(pte); //将新生成的PTE entry添加到硬件页表中 set_pte_at(vma->vm_mm, vmf->address, vmf->pte, pte); vmf->orig_pte = pte; //根据page是否为swapcache if(page == swapcache) { ...
set_pte(pte, pfn_pte(pfn, PAGE_KERNEL_EXEC)); else set_pte(pte, pfn_pte(pfn, PAGE_KERNEL)); …… } } 通过作者的注释, 可以了解到这个函数的作用是把整个物理内存地址都映射到从内核 空间的开始地址,即从0xc0000000的整个内核空间中,