我一直在尝试在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源代码答案 0 :(得分:5)
pteval_t只是将页表条目视为不透明的blob - 在您正在查看的体系结构上,它只是一个32位无符号值。
使用按位运算符和掩码访问PTE中的字段 - 在我方便的源代码(Linux 2.6.24)中,这些字段在include/asm-x86/pgtable_32.h
中定义。您在“英特尔参考手册”中看到的字段(大多数是单位标志)在此处定义 - 例如:
#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
答案 1 :(得分:4)
我建议从O'REILLY购买Understanding the Linux Kernel,以及Linux Device Drivers。并订阅LWN.net;虽然即使没有订阅,你也可以从他们的kernel index页面开始。
对于内存管理,请查看“内存管理”部分的索引页面以及“大内存系统”部分。后者有一些文章讨论转移到四级页表,这有助于理解代码的这个区域。