深入理解Linux内核页表管理(Page Table Management)

页目录描述(Describing the Page Directory)

每一个进程都有一个指针指向它自己的PGD(Page Global Directory),PGD是一个物理页框。该页框包含有一组类型为pgd_t的结构。该类型有具体的架构代码中指定。例如在x86下,其定义如下:

typedef struct { unsigned long long pgd; } pgd_t;
	typedef struct { unsigned long pte_low, pte_high; } pte_t;
	typedef struct { unsigned long long pmd; } pmd_t;

每种架构加载page tables的方式有所不同。例如x86架构下,每个进程的page tables是通过复制mm_struct->pgd到cr3寄存器进行加载的。

PGD中的每一个active项都对应着一个物理页框,该页框包含一组PMD(Page Middle Directory)其类型为pmd_t。

PMD对应的又是一个物理页框,PMD页框中时一组PTE(Page Table Entries)其类型为pte_t,

PTE对应一个物理页框用于存放最终的数据。

一条线性地址可能被切割为多个部分形成多级页表和页内偏移。为了帮助线性地址的切割,为每一级也定义了一个宏:

/* PAGE_SHIFT determines the page size */
	#define PAGE_SHIFT	12
	#define PAGE_SIZE	(1UL << PAGE_SHIFT)
	#define PAGE_MASK	(~(PAGE_SIZE-1))

页表项描述(Describing a Page Table Entry)

如上面所描述,struct pte_t,pmd_t,pgd_t分别描述PTE,PMD,PGD。尽管它们通常是一个非负整数,但是它们仍然被定义成结构体有以下两种原因:

  • 为了类型保护,因此避免它们被人不合时宜的误用
  • 为了支持x86的PAE功能,因为PAE有多处4个bit来描述大于4GB的memory

从下面的定义来看,分别有两种定义:

#ifdef CONFIG_X86_PAE
	extern unsigned long long __supported_pte_mask;
	extern int nx_enabled;
	typedef struct { unsigned long pte_low, pte_high; } pte_t;
	typedef struct { unsigned long long pmd; } pmd_t;
	typedef struct { unsigned long long pgd; } pgd_t;
	typedef struct { unsigned long long pgprot; } pgprot_t;
	#define pte_val(x)	((x).pte_low | ((unsigned long long)(x).pte_high << 32))
	#define HPAGE_SHIFT	21
#else
	#define nx_enabled 0
	typedef struct { unsigned long pte_low; } pte_t;
	typedef struct { unsigned long pmd; } pmd_t;
	typedef struct { unsigned long pgd; } pgd_t;
	typedef struct { unsigned long pgprot; } pgprot_t;
	#define boot_pte_t pte_t /* or would you rather have a typedef */
	#define pte_val(x)	((x).pte_low)
	#define HPAGE_SHIFT	22
#endif

资料直通车:最新Linux内核源码资料文档+视频资料

内核学习地址:

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值