- 论坛徽章:
- 0
|
1. pte_same()这个函数比较的是整个32bit, 低12bit也参与比较? tlb也能感知低12bit?
low 12bits裝的是pte的attribute,所以當然要比較,這邊可以參考cpu的spec,arm or ia32都寫得很詳細。
2. 何时same? 感觉都是不相同的场景啊!
int handle_pte_fault(struct mm_struct *mm,
struct vm_area_struct *vma, unsigned long address,
pte_t *pte, pmd_t *pmd, unsigned int flags)
{
pte_t entry;
spinlock_t *ptl;
entry = *pte;
if (!pte_present(entry)) {
if (pte_none(entry)) {
if (vma->vm_ops) {
if (likely(vma->vm_ops->fault))
return do_linear_fault(mm, vma, address,
pte, pmd, flags, entry);
}
return do_anonymous_page(mm, vma, address,
pte, pmd, flags);
}
if (pte_file(entry))
return do_nonlinear_fault(mm, vma, address,
pte, pmd, flags, entry);
return do_swap_page(mm, vma, address,
pte, pmd, flags, entry);
}
ptl = pte_lockptr(mm, pmd);
spin_lock(ptl);
/* 這裡的same應該判斷是否上面四種其中一種已經做過,如果做過就一定不等於
* 則就不用再往下處理copy-on-write的情況,直接跳到function的尾巴unlock
*/
if (unlikely(!pte_same(*pte, entry)))
goto unlock;
if (flags & FAULT_FLAG_WRITE) {
if (!pte_write(entry))
return do_wp_page(mm, vma, address,
pte, pmd, ptl, entry);
entry = pte_mkdirty(entry);
}
entry = pte_mkyoung(entry);
/* ptep_set_access_flags裡面的same我個人是覺得只是要做防呆而以。*/
if (ptep_set_access_flags(vma, address, pte, entry, flags & FAULT_FLAG_WRITE)) {
update_mmu_cache(vma, address, pte);
} else {
/*
* This is needed only for protection faults but the arch code
* is not yet telling us if this is a protection fault or not.
* This still avoids useless tlb flushes for .text page faults
*/
if (flags & FAULT_FLAG_WRITE)
flush_tlb_fix_spurious_fault(vma, address);
}
unlock:
pte_unmap_unlock(pte, ptl);
return 0;
}
3. 照你说的, fault的处理是改pte并设置tlb无效, 那么tlb miss的处理是cpu自动完成的?
tlb miss在x86裡面是硬體完成,arm裡面有hardware page table walker,預設也是硬體完成。
4. 你提到"包括linear fault, anonymous fault, non-linear fault, swap fault, copy-on-write這些對
page table的更改", 这些fault有何同性? 不是所有的fault都这样么?
linear fault: 是有mmap到檔案的fault,這時候要去page cache所在的radix tree撈(minor fault),
撈不到則到block system上撈(major fault)。
anonymous fault: 沒有map到file,直接從buddy system要一個page,初始化為零,malloc會用到。
non-linear fault: remap-file-pages會用到,把vma area裡面的一段改map到其他的file。
swap fault: 當要存取的page被放在swap space的時候,這邊會跑去swap space裡面撈。
copy-on-write: 這個os的書裡面有,翻翻silberschat的恐龍本吧。
5. 能举个具体的例子么? 比如写一个page, 此page也具有可写属性, 此时进入这个场景?
可寫屬性除了copy-on-write以外都有可能會進入。因為copy-on-write的時候會改成read-only。
|
|