Короткий ответ на ваш вопрос - использовать __get_locked_pte
.Тем не менее, я бы посоветовал против этого, поскольку есть гораздо лучшие (эффективные и справедливые с точки зрения конкуренции за ресурсы) способы достижения вашей цели.
В linux типичная идиома обхода таблиц страниц - это вложенный цикл forчетыре уровня глубины (четыре - это количество уровней таблиц страниц, поддерживаемых linux).Примеры см. copy_page_range
и apply_to_page_range
в мм / память.c .На самом деле, если вы внимательно посмотрите на copy_page_range
, он вызывается при разветвлении от dup_mmap
в kernel / fork.c.Он работает по существу всего vm_area_struct
.
Вы можете повторить идиому, используемую в любой из этих функций.Однако есть несколько предостережений.Например, copy_page_range
полностью поддерживает прозрачные огромные страницы (2.6.38), используя полностью отдельный copy_huge_pmd
внутри copy_pmd_range
.Если вы не хотите писать две отдельные функции (одну для обычных страниц и одну для прозрачных огромных страниц, см. Gracefull fallback
в Documentation/vm/transhuge.txt
.
Дело в том, что виртуальная память в Linux очень сложна, поэтому убедитесь, чточтобы полностью понять все возможные варианты использования. follow_page
in mm / memory.c должен продемонстрировать, как охватить все ваши базы.