Ответ 1
См./proc/*/pagemap и /proc/kpageflags интерфейсы. Сначала вы указываете PFN для адреса, второй говорит вам о грязном бите, заданном PFN.
См. fs/proc/task_mmu.c, Документация /vm/pagemap.txt, Документация/vm/page-types.c.
Можно ли получить доступ к грязности страниц (не общего) mmap из пользовательского пространства под linux 2.6.30+? Платформенные хаки и kludges приветствуются.
В идеале, я ищу массив бит, по одному на страницу (4kB?) в области mmap'ed, которые устанавливаются, если эта страница была записана, так как область была mmap'ed.
(Я знаю, что процесс, выполняющий запись, может отслеживать эту информацию, но это кажется глупым, если ядро все равно это делает.)
Спасибо,
Крис.
См./proc/*/pagemap и /proc/kpageflags интерфейсы. Сначала вы указываете PFN для адреса, второй говорит вам о грязном бите, заданном PFN.
См. fs/proc/task_mmu.c, Документация /vm/pagemap.txt, Документация/vm/page-types.c.
Традиционным решением является mprotect только для чтения, а затем обработать sigsegv и пометить его, прежде чем перепрограммировать, чтобы разрешить записи. Мы сделали это в ObjectStore давным-давно для этой цели.
generic_writepages и balance_dirty_pages_ratelimited_nr кажутся точки входа в ядро (2.6.20), связанные с грязными страницами. Надеюсь, они работают и в 2.6.30+. Интересный вопрос, могу ли я спросить, что вы пишете, что требует такого контроля над страницами?
Эти данные будут постоянно устаревать - возможно, страница может быть записана после того, как ваш процесс видит, что страница грязная.
Тем не менее, тонный способ состоит в том, чтобы сопоставить его в одностраничных фрагментах, а затем посмотрите /proc/pid/smaps
, чтобы увидеть, загрязнены ли куски - что это может закончиться, если ядро сливает страницы.
К сожалению, поскольку таблицы страниц не видны в пространстве пользователя, это самое лучшее, что вы можете сделать без какого-либо патча ядра.
Если ваш массив бит достаточно мал, возможно, вы можете использовать регистры отладки в Intel (хотя я не уверен, как это делается на Linux).