Структура PTE в ядре Linux
-
10-07-2019 - |
Вопрос
Я пытался посмотреть в исходном коде linux структуру / объединение, которое соответствовало бы PTE в системе x86 с отключенным PAE. Пока что я нашел только следующее в arch / x86 / include / asm / page_32.h
typedef union {
pteval_t pte;
pteval_t pte_low;
} pte_t;
Я сейчас немного сбит с толку, поскольку передо мной открыто справочное руководство Intel Vol 3A, и ничто в этом объединении не соответствует дюжине нечетных полей, присутствующих в PTE, как объясняется в руководстве.
Это может быть тривиальный вопрос, но для меня это стало больше камнем преткновения в процессе понимания управления памятью в ядре Linux.
РЕДАКТИРОВАТЬ: у меня есть источник 2.6.29 со мной
Решение
pteval_t просто обрабатывает запись таблицы страниц как непрозрачный большой двоичный объект - в архитектуре, которую вы просматриваете, это просто 32-битное значение без знака.
Доступ к полям в PTE осуществляется с помощью побитовых операторов и масок - в источнике, который мне удобен (Linux 2.6.24), они определены в include / asm-x86 / pgtable_32.h
. Поля, которые вы видите в Справочном руководстве Intel (большинство из которых являются однобитными флагами), определены здесь, например:
#define _PAGE_PRESENT 0x001
#define _PAGE_RW 0x002
#define _PAGE_USER 0x004
#define _PAGE_PWT 0x008
#define _PAGE_PCD 0x010
#define _PAGE_ACCESSED 0x020
#define _PAGE_DIRTY 0x040
#define _PAGE_PSE 0x080 /* 4 MB (or 2MB) page, Pentium+, if present.. */
#define _PAGE_GLOBAL 0x100 /* Global TLB entry PPro+ */
#define _PAGE_UNUSED1 0x200 /* available for programmer */
#define _PAGE_UNUSED2 0x400
#define _PAGE_UNUSED3 0x800
Другие советы
Я бы порекомендовал приобрести Понимание ядра Linux у O'REILLY, а также Драйверы устройств Linux . И подписаться на LWN.net ; хотя вы можете получить довольно хорошее начало со страницы индекса ядра даже без подписки.
Для управления памятью посмотрите на странице индекса «Управление памятью». раздел ... и "Системы с большой памятью" раздел. В последнем есть несколько статей, в которых рассказывается о переходе на четырехуровневые таблицы страниц, которые должны помочь в понимании этой области кода.