2011-08-18 72 views
4

我的問題是mprotect有多快。保護措施與1GB連續內存相比,1MB連續內存有什麼區別?當然,我可以衡量時間,但我想知道發生了什麼。mprotect速度有多快

+0

參考文獻:[毫米/ mprotect.c](http://lxr.free-electrons.com/source/mm /mprotect.c#L232)和[LDD3 ch。 15](http://lwn.net/images/pdf/LDD3/ch15.pdf)。 – user786653

+1

「當然,我可以計算時間」 - 假設你_meant_「當然我可以**測量**時間」 – sehe

回答

4

對源代碼的快速檢查似乎表明它遍歷所選區域中的進程映射並更改其標誌。如果您保護的映射少於整個映射,則會將其分割爲兩個或三個映射。

所以簡而言之就是O(n)其中n是你調用mmap的次數。

你可以看到所有當前地圖中/proc/pid/maps

+0

mprotect迭代頁面嗎?例如。與1000 MB相同的速度是100 MB的mprotect? (在單個大小相同的mmap的情況下)。 – osgx

+1

我不得不懷疑操縱頁表的影響(即在呼叫完成後一段時間內可能較慢的內存訪問)是否會比通過N映射循環的事實產生更大的影響。 – asveikau

+0

不僅修改每頁的位數,還使當前CPU內核和其他CPU內核的TLB無效。 – osgx

1

它是在該地區的頁數爲O(n)也是如此,因爲它應該對所有的PTE(頁轉換條目,它描述virtual-更改訪問位> PageTable中的物理頁面映射)。 Calltree:

mprotect 
-> 
mprotect_fixup 
-> 
change_pte_range 

http://lxr.free-electrons.com/source/mm/mprotect.c#L32

47  do { 
48     oldpte = *pte; 
49     if (pte_present(oldpte)) { 
50       pte_t ptent; 
51 
52       ptent = ptep_modify_prot_start(mm, addr, pte); 
53       ptent = pte_modify(ptent, newprot); 
54 
55       /* 
56       * Avoid taking write faults for pages we know to be 
57       * dirty. 
58       */ 
59       if (dirty_accountable && pte_dirty(ptent)) 
60         ptent = pte_mkwrite(ptent); 
61 
62       ptep_modify_prot_commit(mm, addr, pte, ptent); 
63     } else if (PAGE_MIGRATION && !pte_file(oldpte)) { 
64       swp_entry_t entry = pte_to_swp_entry(oldpte); 
65 
66       if (is_write_migration_entry(entry)) { 
67         /* 
68         * A protection check is difficult so 
69         * just be safe and disable write 
70         */ 
71         make_migration_entry_read(&entry); 
72         set_pte_at(mm, addr, pte, 
73           swp_entry_to_pte(entry)); 
74       } 
75     } 
76   } while (pte++, addr += PAGE_SIZE, addr != end); 

注增量:addr += PAGE_SIZE, addr != end);