私の質問はどれくらい速いかですmprotect。1 GBの連続メモリと比較して、1 MBの連続メモリと言うmprotectingの違いは何ですか?もちろん時間を測定することはできますが、内部で何が起こっているのか知りたいです。
1244 次
2 に答える
4
ソースを簡単にチェックすると、選択したリージョンのプロセスマッピングを繰り返し、フラグを変更していることがわかります。マッピング全体よりも保護しない場合は、2つまたは3つに分割されます。
つまり、mmapを呼び出した回数はO(n)ここにあります。n
あなたはで現在のすべての地図を見ることができます/proc/pid/maps
于 2011-08-18T09:26:14.540 に答える
1
すべてのPTE(PageTableの仮想->物理ページマッピングを記述するページ変換エントリ)のアクセスビットを変更する必要があるため、この領域のページ数もO(n)です。コールツリー:
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);
于 2011-08-18T13:16:20.037 に答える