如果虚拟地址空间可以大于物理地址空间,那么地址映射如何存储在内存中?


14

假设我们正在使用具有40个物理地址位的系统。物理地址总空间(假定字节可寻址内存)为字节,即1 TiB。而且,如果虚拟地址的长度为48位,则意味着虚拟内存可用的地址比物理内存中的地址要多。240

这对我来说很有意义,因为“多余”地址也可能指向硬盘位置。但是,我不了解虚拟地址和物理地址之间的转换是如何发生的。我假设有一个映射存储在某处,该映射将VAS位置链接到物理位置。如果虚拟地址位置多于物理地址,那么如何将所有这些映射存储在内存中?至少需要48位来存储每个虚拟地址,然后再需要40位来存储其映射到的物理位置。因此,显然,您不能仅存储每个虚拟地址与其物理对应物的1:1映射,因为映射每个位置将比物理内存本身占用更多的内存。

我在这里到底想念什么?


即使只有少量的内存和地址空间,您也无法做到这一点。如果您拥有16位物理地址和16位虚拟地址,您仍然将无法存储所有1:1映射!
user253751 '17

2
这个问题甚至比您想的还要复杂。计算机很少具有TB的内存,因此物理内存比虚拟地址空间少。更糟糕的是:每个进程都具有完全独立的虚拟地址空间!
Mooing Duck's

除了硬盘位置之外,您还只有一点点/空间可浪费。例如,您可以在堆栈下方设置一个较大的区域,以防止未检测到的溢出。您可以在防止另一类攻击的地方随机加载。如果地址属于内核或用户,想用一点来表示-即使浪费了一半的空间,也请继续。尽管大多数教科书都专注于调出虚拟内存方面,但还有很多其他内容。
Maciej Piechotka '12

(还请注意,地址可能会别名,这有时很有用,因此,即使A!= B,VA A和地址B仍指相同的
PAP

Answers:


26

完成这项工作的技巧是“分页”。将数据从硬盘放入物理内存时,您不仅会带来一些字节。您带来整个页面。4k字节是非常常见的页面大小。

如果只需要跟踪页面,而不是每个字节,那么映射将变得便宜得多。如果您具有48位地址空间和4096字节页面,则只需跟踪2 ^ 36页中的哪一个(约690亿页)。这样容易得多!找到所有页面的记录称为“页面表”。

如果您实际上需要1-256 TiB的内存,那么放弃几个GB来存储此页表就没什么大不了的。但是在实践中,我们将执行诸如使用多级页表之类的操作,这使我们效率更高一些,只为实际使用的地址空间区域保留页。


6
页面文件是Windows术语,用于磁盘上的物理文件,其中包含由于内存不足而被回收的物理页面框架的内容,需要保留其内容。如果我没记错的话,将虚拟页面地址映射到物理页面地址的数据结构应该称为页面
恢复莫妮卡-ζ-17年

@hexafraction我认为你是对的。我做了改变。
Cort Ammon

2
当实际内存很大时,减少页表所需内存的另一种方法是允许更大的页。x86可以选择混合4 KiB页面和2/4 MiB页面。
Nate Eldredge
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.