页面 table 位于何处?

Where is page table located?

我一直在研究分页和页表。我不明白页表的位置。 在堆栈交换(https://unix.stackexchange.com/questions/487052/where-is-page-table-stored-in-linux)的一个答案中,据说页表位于内核地址 space 中,它位于虚拟内存中(据我了解)。 然而,在伊利诺伊大学 (https://courses.engr.illinois.edu/cs241/sp2014/lecture/09-VirtualMemory_II_sol.pdf) 的演讲幻灯片中,页表似乎在 RAM 中,这是物理内存。 谁能说清楚页表存放在哪里?

提前致谢。

这个问题的答案太笼统了,我觉得属于super-user栈交换

在 x86 系统中,页面 table 是 CPU 使用的结构,但它们太大而无法保存在寄存器中,因此它们保存在 RAM 中。

任何进程都有一个内存映射,其中有两个大区域:用户space 和内核space。内核 space 对于所有进程都是相同的 space。用户 space 是该进程的私有用户。在基于 Linux 的 32 位 X86 系统上,任何等于或大于 0xC0000000 的逻辑地址都属于内核。在该地址下方,是用户 space.

进程的页面 table 保存在内核 space 中。内核在 RAM 中可能有多个页面 table,但只有一个是活动页面 table。在 x86 CPUs 中,它是寄存器 CR3.

指向的页面 table

这里有更详细的工作原理解释:

我认为您对虚拟内存和物理内存的理解有问题。 顾名思义,虚拟内存不是真实的。虚拟内存想法的原因是进程将计算机中的所有存储视为可用内存。例如,在 64 位系统中,一个进程可能会将 2^64 视为它可用的内存,而另一个进程可能会看到同样的东西。所以使用虚拟内存,每个进程都会看到一个连续可用的内存,这可能比系统上的可用内存大得多。然后虚拟内存中的所有地址都应该使用称为页面 tables 的东西转换为等效的物理内存。 页面是单元格(地址)块,例如假设系统中的可用内存(物理)为 2 GB,页面或单元格块已 chosen 为 4 KB,在这种情况下在一个 4 KB 的块或页面 4096 中,不同的单元格或地址可用,我们可以使用 12 位来寻址,因为我们有:

2^12 = 4096

如果总内存为 2 GB,则意味着我们可以:

2GB/4KB = 524288

这意味着我们可以在物理内存中有 524288 个不同的页面,现在其中一些页面只分配给操作系统代码,这意味着只有 os 可以访问它,这些是操作系统程序的代码和指令,可以帮助其他所有程序的执行。其他页面可用于其他进程。

现在假设我们在虚拟内存中有这样一个地址:

0x000075fe

首先我们说我们需要12位来告诉pos页中每个地址的position,因为页是4KB,这个position是5fe,什么操作系统或所有其他内存管理工具呢!是它不会翻译这个 OFFSET,虚拟页面中每个地址的 position 在物理页面中都是一样的,我认为这是使翻译有益的主要特征之一,现在地址的其余部分应转换为物理中的相关页面:

0x00007

为此,应该查看页面table,正如我们所说,它只是内核内存中的一个table,用户无法访问space,因为例子是这样的:


0x00001 0x00004

0x00002 disk ---->表示每一个地址都在磁盘中

0x00007 0x004fe

所以 0x00007 页应该被翻译成 0x004fe,因此地址:

0x000075fe 在虚拟内存中将被翻译成:

0x004fe5fe in the physical memory,这意味着这是一个地址在页号0x004fe和pos5feth - 1的位置。(因为我们知道起点是零)。