#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’ достаточно или нет?