Как проверить, действителен ли x86 PTE или нет в Linux?

#memory #memory-management #linux-kernel #x86-64 #page-tables

#память #управление памятью #linux-ядро #x86-64 #таблицы страниц

Вопрос:

Я пишу модуль ядра, который kmalloc содержит несколько страниц и сбрасывает связанные с ним записи таблицы страниц.
Но я нашел следующее pmd_t , значение которого равно 0x4a726573614c5f72, что является недопустимой записью.

 PMD(V: 0x000000003cfdb3cf P: 0x3c00000b8) = 0x4a726573614c5f72
  

pmd_present(*pmd) Возвращает ненулевое значение, означает true, что вызывает панику ядра при получении pte из pmd.

Вот код для распечатки выше,

 if (pmd amp;amp; pmd_present(*pmd)) {
      printk(" PMD(V: 0x%p P: 0x%llx) = 0x%llxn",
 (void *)pmd, virt_to_phys(pmd), (uint64_t)pmd_val(*pmd));
}
  

Итак, как проверить, действительна ли такая запись или нет в ядре Linux, есть ли для этого какие-либо функции PGD / PUD / PMD / PTE?

Комментарии:

1. Как именно вы сбрасываете эти записи?

2. Поскольку память выделяется из ядра путем вызова kmalloc(); поэтому я сбросил записи таблицы страниц для выделенной памяти, пройдя по дереву таблиц страниц ядра с корнем из init_top_pgt, вызвал такие функции, как pgd_offset(), pud_offset(), pmd_offset(), pmd_val(), но я встретил недопустимый PMDзапись, указанная выше, мне интересно, есть ли способ узнать, действителен ли PMD или нет.

3. Я прошу у вас точный код, вплоть до printk инструкции, поскольку нам это нужно, чтобы понять, есть ли что-то не так. Опубликуйте его, отредактировав свой вопрос.

4. Я обновил вопрос своим кодом, чтобы распечатать запись PMD. Основываясь на pmd_present(* pmd), мне интересно, как узнать, действительно ли страница в записи таблицы страниц присутствует в памяти, бит ‘P’ достаточно или нет?