VMA содержат виртуальные адреса их первого и (одного после) последнего байта:
struct vm_area_struct {
/* The first cache line has the info for VMA tree walking. */
unsigned long vm_start; /* Our start address within vm_mm. */
unsigned long vm_end; /* The first byte after our end address
within vm_mm. */
...
Это означает, что для получения данных страницы необходимо сначала выяснить, в каком контексте работает ваш код?
Если это в контексте процесса, тогда простого copy_from_user
подхода может быть достаточно, чтобы получить фактические данные и просмотр страницы (по всей вашей PGD / PUD / PMD / PTE), чтобы получить PFN, а затем повернуть это к struct page
. (Будьте внимательны, , а не , чтобы использовать соблазнительную virt_to_page(addr)
, так как это будет работать только для адресов ядра).
С точки зрения итерации, вам нужно только итерировать в PAGE_SIZE, по виртуальным адресам, которые вы получаете от VMA.
Обратите внимание, что предполагает , что страницы действительно отображаются. Если нет (!pte_present(pte_t a)
), вам может понадобиться переназначить его самостоятельно для доступа к данным.
Если ваша проверка выполняется в каком-то другом контексте (например, kthread / interrupt), вы должны переназначить страницу из свопа, прежде чем получить к ней доступ, что является совершенно другим случаем. Если вы хотите легкий путь, я бы посмотрел здесь: https://www.kernel.org/doc/gorman/html/understand/understand014.html, чтобы понять, как обрабатывать поиск / извлечение подкачки.