我一直在尝试在 linux 源代码中寻找与禁用 PAE 的 x86 系统上的 PTE 相对应的结构/联合。到目前为止,我在 arch/x86/include/asm/page_32.h 中只发现了以下内容
typedef union {
pteval_t pte;
pteval_t pte_low;
} pte_t;
我现在有点困惑,因为我面前打开了英特尔引用手册第 3A 卷,但该联合中没有任何内容与手册中解释的 PTE 中存在的十几个奇怪字段相对应。
这可能是一个微不足道的问题,但对我来说,它更像是理解 linux 内核内存管理过程中的绊脚石。
编辑:我有 2.6.29 源代码
最佳答案
pteval_t 只是将页表条目视为一个不透明的 blob - 在您正在查看的架构上,它只是一个 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 - linux内核中的PTE结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1441353/