【问题标题】:Where is page table located?页表在哪里?
【发布时间】:2019-10-30 08:18:26
【问题描述】:

我一直在研究分页和页表。我不明白页表的位置。 在堆栈交换(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 中,这是物理内存。 谁能清楚地告诉我页表存储在哪里?

提前谢谢你。

【问题讨论】:

    标签: page-tables


    【解决方案1】:

    这个问题的答案太笼统了,我觉得属于超级用户栈交换。

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

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

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

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

    【讨论】:

    • 感谢关于在超级用户堆栈交换上询问它的建议。我仍然不明白答案如何广泛。如果某些东西在物理内存中,不应该在虚拟内存中,反之亦然?您的意思是唯一的活动页表“保存在内核空间中”,其余的“保存在内存中”?
    • 答案可能很广泛,因为每个 CPU 和每个操作系统都以自己特定的方式处理这个问题。因此,我不得不缩小对我所知道的操作系统和 CPU 的回答:Linux 和 x86。例如,不同的 CPU 可能会将其页表保存在位于 CPU 的内部结构中。
    • 哦,我现在明白了。谢谢。
    【解决方案2】:

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

    2^12 = 4096

    如果总内存是 2 GB,那么这意味着我们可以:

    2GB/4KB = 524288

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

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

    0x000075fe

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

    0x00007

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


    0x00001 0x00004

    0x00002 磁盘 ----> 表示每个这些地址都在磁盘中

    0x00007 0x004fe

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

    虚拟内存中的0x000075fe会被翻译成:

    物理内存中的0x004fe5fe,表示这是页码0x004fe中的地址,5feth-1的位置。(因为我们知道起点为零)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多