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