Linux 是不是对页目录和页表使用自映射?

Posted

技术标签:

【中文标题】Linux 是不是对页目录和页表使用自映射?【英文标题】:Does Linux use self-map for page directory and page tables?Linux 是否对页目录和页表使用自映射? 【发布时间】:2011-07-13 10:41:29 【问题描述】:

我只是问这个问题,因为我很好奇 Linux 内核是如何工作的。根据http://i-web.i.u-tokyo.ac.jp/edu/training/ss/lecture/new-documents/Lectures/02-VirtualMemory/VirtualMemory.ppt,Windows 在其页目录和名为 self-map 的页表中使用特殊条目,以便能够从内核虚拟地址空间操作页目录/表内容。如果有人熟悉 Linux 内存管理,请告诉我 Linux 内核是否以类似或不同的方式处理此问题。谢谢。

【问题讨论】:

【参考方案1】:

是的,在 Linux 中,页表也映射到地址空间。但是某些架构中的分页数据结构可能会使用物理地址。所以它在Linux中没有修复。但是您可以轻松访问该表。

这是访问页表的内核代码

struct mm_struct *mm = current->mm;
pgd = pgd_offset(mm, address);
pmd = pmd_offset(pgd, address);
pte = *pte_offset_map(pmd, address);

了解更多Linux内存管理see this

IA32上的Cr3寄存器存放的是页表基指针(pgd指针),它存放的是物理地址。这是true even for Windows(因为它是 x86 处理器的功能,而不是操作系统的功能)。

阅读 this article 了解 IA32 分页。

编辑2: Task struct 包含一个 mm_struct 实例,该实例与该任务的内存管理(因此是一个进程)相关,这个 mm_struct 有一个 pgd_t * pgd。 load_cr3 在cr3 寄存器中加载页目录表的物理地址,但它需要pgt 的虚拟地址。所以mm_struct包含pgt的虚拟地址。

由于页表位于内核空间中,并且内核虚拟内存直接映射到 ram,所以它只是一个简单的宏。

【讨论】:

能否请您稍微评论一下这段代码?这个函数具体是做什么的?什么是pgd、pmd、pte?页目录、页中间目录和页表项的虚拟地址?地址是什么?谢谢。 实际上它们是结构,但只是为了抽象,在内部它们最终得到“页面目录”、“页面中间目录”和“页表条目”的虚拟结果跨度> 结构是否存储相应表的物理或虚拟地址? 它们存储表的虚拟地址。 还有一个问题 - 宏 pgd_offset 定义为 #define pgd_offset(mm, address) ((mm)->pgd + pgd_index((address)))。 mm->pgd是存放页面目录的物理地址还是虚拟地址?

以上是关于Linux 是不是对页目录和页表使用自映射?的主要内容,如果未能解决你的问题,请参考以下文章

Linux从头学16:操作系统在加载应用程序时,是如何把页目录和页表当做普通物理页进行操作的?

Linux从头学16:操作系统在加载应用程序时,是如何把页目录和页表当做普通物理页进行操作的?

理论+实例,带你掌握Linux的页目录和页表

linux kernel 内存管理-页表、TLB

linux 临时页目录和页表初始化分析

Linux从头学15:页目录和页表-理论 + 实例 + 图文的最完全最接地气详解