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,...
它的一般流程是CPU调用set_pte_at()修改了内存里面的PTE,然后进行tlbi等动作。这里就变地非常复杂了: 我们看看barrier1,它在屏障store和tlbi之间,由于二者一个是狗狗,一个是消杀烟雾,显然不能是dmb,只能是dsb;我们需要CPU1看到set_pte_at的动作先于tlbi的动作,所以这个屏障的范围应该是ISH;由于屏障需要保障的...
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...
既然现在 MappedByteBuffer 在 JVM 进程页表中对应的 pte 是空的,内核就通过 mk_pte 创建一个 pte 出来,并将刚加载进来的文件页的物理内存地址,以及 MappedByteBuffer 相关的操作权限 vm_page_prot,设置到 pte 中。 随后通过 set_pte_at 函数将新初始化的这个 pte 塞到 JVM 页表中。但是这里要注意的是,这里...
(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)//清...
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))); ...
255 static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, 256 pte_t *ptep, pte_t pteval) 257 { 258 unsigned long ext = 0; 259 260 if (addr < TASK_SIZE && pte_valid_user(pteval)) { 261 if (!pte_special(pteval)) ...
反向映射查找这个页的每个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_...
entry =pte_mkclean(entry); //清脏标记 set_pte_at(vma->vm_mm, address, pte, entry) //设置到页表项中 ->TestClearPageDirty(page) //清页描述符脏标记 2.3 第二次写访问文件页时 1)脏页还没有回写时(确切的说是调用clear_page_dirty_for_io之前),页描述符已经设置了脏标记,页表项已经设置了脏...
1 152 static inline pte_t pte_wrprotect(pte_t pte) 2 153 { 3 154 pte = clear_pte_bit(pte, __pgprot(PTE_WRITE));//清可写位 4 155 pte = set_pte_bit(pte, __pgprot(PTE_RDONLY));//置位只读位 5 156 return pte; 6 157 ...