如何在后备存储上将虚拟地址转换为其物理地址?

时间:2013-07-24 10:02:56

标签: c windows operating-system

我们有地址转换表,用于将进程的虚拟地址(VA)转换为其在RAM中的相应物理地址,但如果该表没有VA的任何条目,则会导致页面错误,而kernal会转到后备存储(通常是硬盘驱动器)并获取相应的数据并更新RAM和地址转换表。所以我的问题是操作系统如何知道后备存储中与VA相对应的地址是什么?它是否有单独的转换表?

4 个答案:

答案 0 :(得分:3)

进程从分配虚拟内存开始。当程序开始实际寻址虚拟内存地址时,最终将导致页面错误。操作系统知道内存访问是有效的。因为它是明确分配的。

因此,没有造成任何伤害,操作系统只是将虚拟机地址映射到物理地址。

如果页面错误是针对先前请求而不是的地址是有效的VM地址,则处理器将发现该地址没有页表条目。而是会在程序中引发GP故障,AccessViolation或segfault。程序结束时Kaboom。

答案 1 :(得分:2)

没有直接关联,至少不是你想象的方式。

操作系统将虚拟和逻辑RAM以及交换空间(后备存储)和映射文件划分为页面,最常见的是4096字节。

当您的代码访问某个地址时,这始终是页面内的虚拟地址,该地址可以是有效内核,有效未访问,有效内核或无效。操作系统可能在其书中有其他属性(例如“已写入”),但它们对我们来说无关紧要。

如果页面是in-core,那么它有一个物理地址,否则它没有。当换出并再次出现时,相同的相同页面理论上可以很好地落在存储器的不同的物理区域中。类似地,内存中的某个其他页面(虚拟或物理)之后的页面可以在交换文件中的页面之前或在内存映射文件中。这不能保证。

因此,没有将虚拟地址转换为后备存储中的物理地址的事情。只有从虚拟地址到页面的转换,该页面可能暂时具有物理地址。在最简单的情况下,“翻译”意味着除以4096,但当然其他方案也是可能的。

此外,每次代码访问内存位置时,必须将虚拟地址转换为物理地址。 CPU内部存在专用逻辑以完全自动地进行此转换(对于“热”页的非常小的子集,通常少至64),或者以硬件辅助的方式,这通常涉及或多或少地查找复杂的等级结构 这也是一个错误,但它是你看不到的错误。您可以看到的唯一故障是操作系统没有有效页面(或由于某种原因无法提供)时出现的故障,因此无法为要翻译的虚拟机分配物理地址之一。

当您的程序要求内存时,操作系统会记住某些页面有效,但它们尚未存在,因为您从未访问过它们。

第一次访问页面时,发生了一个错误,显然它的地址在转换表中没有任何地方(怎么可能,它不存在!)。因此操作系统查看其书籍(假设页面有效),它要么从磁盘加载页面,要么分配零页面的地址。

不是很少,操作系统会作弊,并且所有零页都是相同的写保护零页,直到您实际写入它(此时,发生故障并且您被秘密地重定向到不同的物理内存区域,也可以写入。

否则,即如果您没有预留内存,操作系统会发送一个信号(或等效的,Windows称之为“异常”),除非处理,否则将终止您的进程。

由于多种原因,操作系统可能会在以后决定从您的工作集中删除一个或多个页面。这通常不会立即删除它们,但是如果需要更多内存,则将它们作为交换(用于非映射数据)或丢弃(用于映射数据)的候选对象。当您再次访问其中一个页面中的地址时,它会重新添加到您的工作集中(可能会推出另一个页面)或从磁盘重新加载。

在任何一种情况下,所有操作系统需要知道的是如何将您的虚拟地址转换为某种类型的页面标识符(例如“页面帧号”),以及该页面是否为常驻(以及在哪个地址)。 / p>

答案 2 :(得分:0)

我认为您的问题答案是关于中断表的问题。 页面错误是一种软件中断,操作系统必须对该中断有一些解决方案。解决方案代码已经在os内核中,那段代码地址就在中断表中。所以发生页面错误, os将转到那段代码,将未映射的页面放入物理内存。

答案 3 :(得分:-1)

这是特定于操作系统的,但许多实现与内存映射文件功能共享逻辑(因此匿名页面实际上是页面文件的内存映射视图,标记为内容可以在取消映射而不是刷新时丢弃)。

对于Windows,其中大部分都记录在案here, on the CreateFileMapping page