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:操作系统在加载应用程序时,是如何把页目录和页表当做普通物理页进行操作的?