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

tic*_*chy 3 paging operating-system memory-management linux-kernel

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

Zim*_*bao 6

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

这是访问页表的内核代码

struct mm_struct *mm = current->mm;
pgd = pgd_offset(mm, address);
pmd = pmd_offset(pgd, address);
pte = *pte_offset_map(pmd, address);
Run Code Online (Sandbox Code Playgroud)

要了解有关 Linux 内存管理的更多信息,请参阅此

IA32上的Cr3寄存器存放页表基指针(pgd指针),存放物理地址。即使对于 Windows也是如此(因为它是 x86 处理器的功能,而不是操作系统的功能)。

阅读本文以了解 IA32 分页。

Edit2: 任务结构包含一个与该任务的内存管理相关的mm_struct实例(因此是一个进程),它mm_struct有一个pgd_t * pgd. load_cr3cr3寄存器中加载页目录表的物理地址,但它采用 pgt 的虚拟地址。所以mm_struct包含 的虚拟地址pgt

由于页表在内核空间中,并且内核虚拟内存直接映射到 ram,因此它只是简单的宏。