Memory management Linux是否对页面目录和页面表使用自映射?

Memory management Linux是否对页面目录和页面表使用自映射?,memory-management,operating-system,linux-kernel,paging,Memory Management,Operating System,Linux Kernel,Paging,我问这个问题是因为我很好奇Linux内核是如何工作的。据介绍,Windows在其页面目录和页面表中使用名为self-map的特殊条目,以便能够从内核虚拟地址空间操作页面目录/表内容。如果有人熟悉Linux内存管理,请告诉我Linux内核是否以类似或不同的方式处理此问题。谢谢。是的,在Linux中,页表也映射到地址空间。但是,某些体系结构中的分页数据结构可能使用物理地址。所以它在Linux中没有被修复。但是,您可以轻松访问该表 下面是访问页面表的核心代码 struct mm_struct *mm

我问这个问题是因为我很好奇Linux内核是如何工作的。据介绍,Windows在其页面目录和页面表中使用名为self-map的特殊条目,以便能够从内核虚拟地址空间操作页面目录/表内容。如果有人熟悉Linux内存管理,请告诉我Linux内核是否以类似或不同的方式处理此问题。谢谢。

是的,在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内存管理的更多信息

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

阅读以了解IA32分页

编辑2: 包含与该任务(即进程)的内存管理相关的实例,此
mm_结构
具有
pgd\u t*pgd
。在
cr3
寄存器中加载页面目录表的物理地址,但它采用pgt的虚拟地址。因此
mm_struct
包含
pgt
的虚拟地址


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

请您对这段代码稍加评论好吗?这个函数到底做什么?什么是pgd,pmd,pte?页面目录、页面中间目录和页面表条目的虚拟地址?地址是什么?谢谢。如果你看到的话,它们实际上是结构,但仅仅是为了抽象,它们在内心深处最终会得到“页面目录”、“页面中间目录”和“页面表条目”的虚拟结果结构是否存储相应表的物理地址或虚拟地址?它们存储表的虚拟地址。还有一个问题-宏pgd_offset被定义为#define pgd_offset(mm,address)((mm)->pgd+pgd_index((address)))。mm->pgd是否存储页面目录的物理或虚拟地址?