分页机制是硬件对分并芹页的支持,这是虚拟内存管理的硬件基础。握圆要想使这种硬件机制充分发挥其功能,必须有相应软件的支持,我们来看一下Linux所定义的一些主要数据结构,其分布在include/asm-i386/目录下的page.h,pgtable.h及pgtable-2level.h三个文件中。
1. 表项的定义
如上所述,PGD、PMD及PT表的表项都占4个字节,因此,把它们定义为无符号长整数,分别叫做pgd_t、pmd_t及pte_t(pte 即Page table Entry),在page.h中定义如下:
typedef struct { unsignedlong pte_low} pte_t
typedef struct { unsignedlong pmd} pmd_t
typedef struct { unsigned long pgd}pgd_t
typedefstruct { unsigned long pgprot} pgprot_t
可以看出,Linux没有把这几个类型直接定义长整数而是定义为一个结构,这是为了让gcc在编译时进行更严格的类型检查。另外,还定义了几个宏来访问这些结构的成分,这也是一种面向对象思想的体现:
#definepte_val(x) ((x).pte_low)
#define pmd_val(x) ((x).pmd)
#define pgd_val(x) ((x).pgd)
从图2.13可以看出,对这些表项应该定义成位段,但内核并没有这样定义段蔽塌,而是定义了一个页面保护结构pgprot_t和一些宏:
typedefstruct { unsigned long pgprot} pgprot_t
#definepgprot_val(x) ((x).pgprot)
字段pgprot的值与图2.13表项的低12位相对应,其中的9位对应0~9位,在pgtalbe.h中定义了对应的宏:
#define _PAGE_PRESENT 0×001
#define _PAGE_RW0×002
#define _PAGE_USER 0×004
#define _PAGE_PWT 0×00
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)