linux内核中的PTE结构

时间:2009-09-17 21:05:06

标签: linux linux-kernel paging

我一直在尝试在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源代码

2 个答案:

答案 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页面开始。

对于内存管理,请查看“内存管理”部分的索引页面以及“大内存系统”部分。后者有一些文章讨论转移到四级页表,这有助于理解代码的这个区域。