页表在哪里?

时间:2019-06-16 13:47:43

标签: page-tables

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

谢谢。

2 个答案:

答案 0 :(得分:1)

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

2 ^ 12 = 4096

如果总内存为2 GB,则表明我们可以:

2GB / 4KB = 524288

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

现在让我们说我们在虚拟内存中有一个这样的地址:

0x000075fe

首先,我们说我们需要12位来告知页面中每个地址的位置,因为页面为4 KB,此位置为5fe,这是什么操作系统或其他内存管理工具!是它不会翻译此偏移量,虚拟页面中每个地址的位置在物理页面中将是相同的,我认为这是使翻译受益的主要特征之一,现在其余地址应该被翻译为以下相关页面:

0x00007

为此,应该查看页表,正如我们所说的,它只是内核内存中的表,在用户空间中不可访问,例如:


0x00001 0x00004

0x00002磁盘---->表示所有这些地址都在磁盘中

0x00007 0x004fe

因此0x00007页面应转换为0x004fe,因此地址为:

虚拟内存中的

0x000075fe将被转换为:

物理内存中的

0x004fe5fe,这意味着它是页码0x004fe中的地址和5feth-1的位置(因为我们知道起始点为零)。

答案 1 :(得分:0)

这个问题的答案太广泛了,我认为它属于超级用户堆栈交换。

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

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

进程的页表保存在内核空间中。内核在RAM中可能有多个页表,但是只有一个是活动页表。在x86 CPU中,它是寄存器CR3指向的页表。

这里有更详细的解释:https://stackoverflow.com/a/20792205/3011009