手把手教你学PCIE--多级页表机制详解(4):PGD表、PUD表、PMD表、PTE表各自能映射的内存范围​​

目录

​​核心前提​​

​​1. PTE表:直接映射物理内存的“最后一公里”​​

关键参数:

PTE表的总映射能力:

​​2. PMD表:通过PTE表间接映射更大内存​​

关键参数:

PMD表的总映射能力:

​​3. PUD表:通过PMD表间接映射更大内存​​

关键参数:

PUD表的总映射能力:

​​4. PGD表:通过PUD表间接映射整个虚拟地址空间​​

关键参数:

PGD表的总映射能力:

​​总结:各级页表的映射能力对比​​

​​关键验证:与x86-64虚拟地址空间的匹配​​

​​补充说明:页表本身的内存占用​​

​​结论​​


理解​​PGD表、PUD表、PMD表、PTE表各自能映射的内存范围​​,需要结合多级页表的层级结构、每级页表的条目数,以及每级页表通过条目间接控制的内存范围。以下是详细解释:

​核心前提​

在x86-64架构的四级页表(PGD→PUD→PMD→PTE)中:

  • 每级页表(PGD/PUD/PMD/PTE)的大小均为 ​​4KB​​(4096字节)。
  • 每个页表条目(Entry)占 ​​8字节​​(64位),因此每级页表最多包含 4096÷8=512 个条目。
  • 每级页表的条目作用是​​指向下一级页表的基地址​​(PGD→PUD→PMD→PTE),最终PTE条目指向​​物理页框​​(4KB内存块)。
### 三级标题:多级页表设计的背景与必要性 在操作系统中,虚拟内存的实现依赖于页机制,用于将虚拟地址映射到物理地址。随着虚拟地址空间的扩大,单级页的设计会导致页占用大量内存,尤其在 64 位系统中,这一问题尤为突出。为了解决这一问题,操作系统引入了多级页表结构,通过分级管理页项,显著减少了内存占用[^1]。 ### 三级标题:多级页表如何节省内存空间 多级页表的核心优势在于其按需分配的特性。在单级页中,每个虚拟地址空间的页项都必须存在,即使某些地址范围未被使用,这导致大量内存被浪费。而在多级页表中,只有实际使用的地址范围才会分配对应的页项。例如,一级页中的某个页项如果未被使用,则对应的二级页甚至不需要存在,从而节省内存[^3]。 ### 三级标题:多级页表对地址映射的优化 多级页表虽然增加了地址转换的复杂度,需要多次访问内存,但这种结构允许操作系统更高效地管理内存资源。例如,在进程切换时,仅需切换页基地址,而不需要重新构建整个页结构。此外,现代处理器通过 TLB(Translation Lookaside Buffer)缓存频繁访问的页项,进一步减少了多级页表带来的性能开销[^2]。 ### 三级标题:Linux 内核中的多级页表实现 Linux 内核在 64 位架构下采用四级页结构(PGDPUDPMDPTE),以支持更大的地址空间。其中,PGD(Page Global Directory)是最高级页,用于索引下一级页PUD)。PUD 再索引 PMD(Page Middle Directory),最终通过 PTE(Page Table Entry)完成虚拟地址到物理地址的映射。这种结构不仅支持大内存系统,还保持了良好的内存利用率和灵活性。 ### 三级标题:多级页表的典型应用场景 - **进程隔离**:每个进程拥有独立的页结构,确保地址空间隔离。 - **动态内存分配**:按需分配页项,避免内存浪费。 - **共享内存**:多个进程可以通过共享页项访问同一物理内存区域。 - **内存保护**:通过页项的访问权限位实现读写保护和执行控制。 ### 三级标题:示例代码:Linux 中的页项操作 ```c #include <linux/mm.h> #include <linux/highmem.h> void map_page(pgd_t *pgd, unsigned long vaddr, phys_addr_t paddr, pgprot_t prot) { pud_t *pud; pmd_t *pmd; pte_t *pte; pud = pud_offset(pgd, vaddr); if (pud_none(*pud)) { pud_populate(current->mm, pud, (pmd_t *)get_zeroed_page(GFP_KERNEL)); } pmd = pmd_offset(pud, vaddr); if (pmd_none(*pmd)) { pmd_populate(current->mm, pmd, (pte_t *)get_zeroed_page(GFP_KERNEL)); } pte = pte_offset_kernel(pmd, vaddr); set_pte(pte, pfn_pte(PFN_DOWN(paddr), prot)); } ``` 该代码演示了如何在 Linux 内核中动态分配并设置多级页表项,实现虚拟地址到物理地址的映射
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蘑菇二号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值