Как быстро работает mprotect - PullRequest
4 голосов
/ 18 августа 2011

У меня вопрос, насколько быстро mprotect.Какая разница между mprotecting, скажем, 1 МБ непрерывной памяти по сравнению с 1 ГБ непрерывной памяти?Конечно, я могу измерить время, но я хочу знать, что происходит под капотом.

Ответы [ 2 ]

4 голосов
/ 18 августа 2011

Быстрая проверка источника, по-видимому, указывает на то, что он перебирает отображения процессов в выбранной области и меняет свои флаги.Если вы защищаете меньше, чем целое отображение, оно разделит его на два или три.

Короче говоря, это O(n), где n - количество раз, которое вы вызывали mmap.

Вы можете видеть все текущие карты в /proc/pid/maps

1 голос
/ 18 августа 2011

Это также 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);

...