2009-09-17 190 views
3

我一直试图在Linux源代码中查找与PAE禁用的x86系统上的PTE对应的结构/联合。到目前为止,我只找到了拱以下/ 86 /包括/ ASM/page_32.hLinux内核中的PTE结构

typedef union { 
     pteval_t pte; 
     pteval_t pte_low; 
} pte_t; 

我有点糊涂了,现在因为我有英特尔参考手册卷3A在我面前打开并且该联合中没有任何内容与手册中解释的PTE中的十几个奇数字段相对应。

这可能是一个微不足道的问题,但对我来说,它已变得更像是理解Linux内核中内存管理过程中的一个绊脚石。

编辑:我有2.6.29源跟我

+0

你在看哪个版本的Linux源代码? – caf 2009-09-18 00:47:47

回答

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 
+0

啊,谢谢:)这几乎清除了一切 – user108127 2009-09-18 02:50:38

4

我会建议由O'Reilly购买Understanding the Linux Kernel,以及Linux Device Drivers。并订阅LWN.net;尽管你可以从他们的kernel index页面得到一个非常好的开始,即使没有订阅。

对于内存管理,请查看索引页面上的“内存管理”部分以及“大内存系统”部分。后者有几篇文章谈到向四层页表转移,这应该有助于理解代码的这一领域。

+0

谢谢。我现在正在研究LWN – user108127 2009-09-18 02:51:36