我的问题是mprotect
有多快。与1 GB连续内存相比,将1 MB连续内存与1 GB连续内存相比,有什么区别?当然,我可以衡量时间,但我想知道引擎盖下的内容。
答案 0 :(得分:4)
对源代码的快速检查似乎表明它迭代了所选区域中的进程映射并更改了它们的标志。如果你保护不到一个完整的映射,它会将它分成两个或三个。
简而言之就是O(n)
,其中n
是您调用mmap的次数。
您可以在/proc/pid/maps
答案 1 :(得分:1)
该区域的页数也是O(n),因为它应该更改所有PTE上的访问位(页面翻译条目,它描述了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);