Можно ли найти грязность страниц mmap из пользовательского пространства?

Можно ли получить доступ к грязности страниц (не общего) mmap из пользовательского пространства под linux 2.6.30+? Платформенные хаки и kludges приветствуются.

В идеале, я ищу массив бит, по одному на страницу (4kB?) в области mmap'ed, которые устанавливаются, если эта страница была записана, так как область была mmap'ed.

(Я знаю, что процесс, выполняющий запись, может отслеживать эту информацию, но это кажется глупым, если ядро ​​все равно это делает.)

Спасибо,

Крис.

Ответы

Ответ 1

См./proc/*/pagemap и /proc/kpageflags интерфейсы. Сначала вы указываете PFN для адреса, второй говорит вам о грязном бите, заданном PFN.

См. fs/proc/task_mmu.c, Документация /vm/pagemap.txt, Документация/vm/page-types.c.

Ответ 2

Традиционным решением является mprotect только для чтения, а затем обработать sigsegv и пометить его, прежде чем перепрограммировать, чтобы разрешить записи. Мы сделали это в ObjectStore давным-давно для этой цели.

Ответ 3

generic_writepages и balance_dirty_pages_ratelimited_nr кажутся точки входа в ядро ​​(2.6.20), связанные с грязными страницами. Надеюсь, они работают и в 2.6.30+. Интересный вопрос, могу ли я спросить, что вы пишете, что требует такого контроля над страницами?

Ответ 4

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

Тем не менее, тонный способ состоит в том, чтобы сопоставить его в одностраничных фрагментах, а затем посмотрите /proc/pid/smaps, чтобы увидеть, загрязнены ли куски - что это может закончиться, если ядро ​​сливает страницы.

К сожалению, поскольку таблицы страниц не видны в пространстве пользователя, это самое лучшее, что вы можете сделать без какого-либо патча ядра.

Ответ 5

Если ваш массив бит достаточно мал, возможно, вы можете использовать регистры отладки в Intel (хотя я не уверен, как это делается на Linux).