BUG_ON(!pte_none(*pte)); if(!pfn_modify_allowed(pfn,prot)){ err=-EACCES; break; } /* *pte_none()判断这个pte是否存在 *pfn_pte()由页帧号pfn得到pte *pte_mkspecial()设置软件的PTE_SPECIAL标志位(三级页表才会用该标志位) *set_pte_at()把pte设置到硬件页表中 */ set_pte_at(mm,addr,...
* pte. do_swap_page() will wait until the migration * pte is removed and then restart fault handling. */ BUG_ON(TTU_ACTION(flags) != TTU_MIGRATION); entry = make_migration_entry(page, pte_write(pteval)); } set_pte_at(mm, address, pte, swp_entry_to_pte(entry)); BUG_ON(pte_...
set_pte_at(mm, address, page_table, entry); /* No need to invalidate - it was non-present before */ /*更新MMU*/ update_mmu_cache(vma, address, entry); unlock: pte_unmap_unlock(page_table, ptl); return 0; release: mem_cgroup_uncharge_page(page); page_cache_release(page); goto...
由于ARM 存在软件 PTE 和 硬件 PTE,所以每次修改 PTE,我们需要对软件 PTE 和 硬件 PTE 都进行修改。arch/arm/include/asm/pgtable.h中的set_pte_at函数修改 PTE: 255 static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, 256 pte_t *ptep, pte_t pteval) 257 { 258 unsigned ...
pte= pte_alloc_map_lock(mm, pmd, addr, &ptl);if(!pte)return-ENOMEM; arch_enter_lazy_mmu_mode();do{ BUG_ON(!pte_none(*pte));/*这是映射的最后一级:把物理地址的值填写到pte表项*/set_pte_at(mm, addr, pte, pte_mkspecial(pfn_pte(pfn, prot))); ...
反向映射查找这个页的每个vma,调用清脏标记和写保护处理1011| ->entry =pmdp_invalidate(vma, address, pmd);12| entry = pmd_wrprotect(entry);//写保护处理,设置只读13| entry = pmd_mkclean(entry);//清脏标记 set_pte_at(vma->vm_mm, address, pte, entry)//设置到页表项中1415|->set_page_...
(page)//清脏标记 mm/rmap.c->page_mkclean_one//反向映射查找这个页的每个vma,调用清脏标记和写保护处理->entry=pte_wrprotect(entry);//写保护处理,设置只读entry=pte_mkclean(entry);//清脏标记 set_pte_at(vma->vm_mm, address, pte, entry) //设置到页表项中->TestClearPageDirty(page)//清...
entry =pte_mkclean(entry); //清脏标记 set_pte_at(vma->vm_mm, address, pte, entry) //设置到页表项中 ->TestClearPageDirty(page) //清页描述符脏标记 2.3 第二次写访问文件页时 1)脏页还没有回写时(确切的说是调用clear_page_dirty_for_io之前),页描述符已经设置了脏标记,页表项已经设置了脏...
set_pte_at(vma->vm_mm, address, ptep, pte);/* * No need to invalidate - it was non-present before. However * secondary CPUs may have mappings that need invalidating. */ update_mmu_cache(vma, address, ptep); }/* * Tries to restore an exclusive pte if the page lock can be ...
在内核中,凡是有物理内存出现的地方,就一定伴随着页表的映射,vmalloc 也不例外,当分配完物理内存之后,就需要修改内核页表,然后将物理内存映射到 vmalloc 虚拟内存区域中,当然了,这个过程也伴随着 vmalloc 区域中的这些虚拟内存地址在内核页表中对应的 pgd,pud,pmd,pte 相关页目录项以及页表项的创建。image...