我一直在研究分页和页表。我看不懂页表在哪里。在堆栈交换(https://unix.stackexchange.com/questions/487052/where-is-page-table-stored-in-linux)中的一个答案中,据说页表位于内核地址空间中,这是在虚拟内存中(据我所理解)。然而,在伊利诺伊大学(sol.pdf)的演讲幻灯片中,页表似乎存在于内存中,即物理内存。有人能清楚地告诉我页面表存储在哪里吗?
提前谢谢你。
发布于 2020-07-18 02:58:30
我认为你在理解虚拟内存和物理内存方面有问题。顾名思义,虚拟内存不是真实的。虚拟内存产生的原因是,进程将计算机中的所有存储视为可用的内存。例如,在64位系统中,进程可能会将2^64视为其可用的内存,而另一个进程可能会看到相同的事情。因此,使用虚拟内存,每个进程都会看到一个可用于它的连续内存,它可能比系统上可用的内存大得多。那么,虚拟内存中的所有地址都应该使用称为页表的内容转换为等效的物理内存。页面是单元格(地址)块,例如,假设系统中的可用内存(物理)为2GB,而单元格的页或块被选择为4KB,在这种情况下,4KB块或4096个不同的单元格或地址是可用的,我们可以使用12位来处理,因为我们有:
2^12 = 4096
如果总的内存是2GB,那么这意味着我们可以拥有:
2GB/4KB = 524288
这意味着我们可以在物理内存中有524288个不同的页面,现在这些页面中的一些只分配给操作系统代码,这意味着只有操作系统才能访问它,这些是操作系统程序的代码和指令,可以帮助其他程序的执行。其他页面可用于其他进程。
现在假设我们在虚拟内存中有这样一个地址:
0x000075fe
首先,我们说过,我们需要12位来告诉每个地址在页面本身的位置,因为页面是4KB,这个位置是5fe,操作系统或其他内存管理工具所做的!它不会翻译这个偏移量,虚拟页面中每个地址的位置在物理页面上都是一样的,我认为这是使翻译有益的主要特性之一,现在剩下的地址应该被翻译到物理页面中的相关页面,即:
0x00007
为此,应该查找页面表,正如我们所说的,它只是内核内存中的一个表,在用户空间中是不可访问的,例如,如下所示:
0x00001 0x00004
0x00002磁盘
0x00007 0x004fe
因此,0x00007页应翻译为0x004fe,因此地址为:
虚拟内存中的0x000075fe将被转换为:
在物理内存中的0x004fe5fe,这意味着这是一个在页号0x004fe中的地址和5feth -1的位置(因为我们知道起点是零)。
https://stackoverflow.com/questions/56619431
复制相似问题