我一直在尝试在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中定义。您在“英特尔参考手册”中看到的字段(大多数是单位标志)在此处定义 - 例如:

#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

其他提示

我建议从O'REILLY购买了解Linux内核,以及 Linux设备驱动程序。并订阅 LWN.net ;虽然即使没有订阅,你也可以从他们的内核索引页面开始。

对于内存管理,请在索引页面上查看<!>“内存管理<!>”; section ...和<!> quot;大内存系统<!> quot;部分。后者有一些文章讨论转移到四级页表,这有助于理解代码的这个区域。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top