【问题标题】:PTE structure in the linux kernellinux内核中的PTE结构
【发布时间】:2009-09-18 10:49:39
【问题描述】:

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

【问题讨论】:

  • 你在看哪个版本的 Linux 源代码?

标签: linux linux-kernel paging


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我建议从 O'REILLY 购买 Understanding the Linux Kernel 以及 Linux Device Drivers。并订阅LWN.net;尽管即使没有订阅,您也可以从他们的 kernel index 页面获得一个不错的开始。

    对于内存管理,请查看索引页的“内存管理”部分...和“大内存系统”部分。后者有几篇文章讨论了向四级页表的迁移,这应该有助于理解这方面的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-30
      • 2019-03-24
      • 1970-01-01
      • 2014-08-22
      • 2012-09-07
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      相关资源
      最近更新 更多