我们看到进程的虚拟地址(在分页系统中),这些虚拟地址存在于何处?

时间:2016-09-17 11:13:54

标签: assembly operating-system paging virtual-memory memory-segmentation

我们看到虚拟地址对应于任何指令,所以我的问题是这些虚拟地址存在于何处?如果我们在gdb中看到反汇编,我们看到虚拟地址这些地址在哪里?请不要说它只是必须通过页表映射到物理地址的虚拟地址,我知道但是我们在gdb中看到的这些虚拟地址存在于何处?在RAM或硬盘中?

3 个答案:

答案 0 :(得分:2)

虚拟地址不存在与街道地址不存在的方式相同。只有街道地址引用的房屋可以存在,并且以相同的方式,虚拟地址引用的存储可以(但不是必须)存在。什么样的存储取决于系统。通常它是RAM,但它也可以是ROM,内存映射外设,开放总线(即没有)或其他东西。

答案 1 :(得分:2)

CPU寄存器,内存和任何其他存储(包括磁盘)中可能存在地址(或任何其他数值)。但这对你来说可能并不令人惊讶,也不是你所要问的。

如果我们谈论的是32位x86页面翻译,那么页面表格不包含经过翻译到物理地址的虚拟地址。页表只包含物理地址,但不包含虚拟地址。不需要在页表内存储虚拟地址。

让我们简化一下,假设系统只有一个页表,这个页表包含1024个代码/数据页的物理地址。这里的虚拟地址在哪里?它们几乎是页表的索引。如果页面大小为4KB且所有地址都是22位,则虚拟地址的12个低位指定代码/数据页面内的位置(0到4095),虚拟地址的10个高位选择其中一个页表中有1024页。当CPU使用虚拟地址访问内存时,它会将虚拟地址分解为页表的索引和所选页面中的偏移量。然后它获取页面的物理地址(来自页面表),在页面中添加偏移量,然后使用生成的物理地址读取或写入内存。

答案 2 :(得分:1)

回答与x86相关的问题的整体简化可能是:

如果发现指令指针(IP)与标记为 not present 的页面中的虚拟内存地址相关联,则会导致页面错误。页面错误处理程序将加载带有代码的空闲页面框架,将其映射到虚拟内存,标记虚拟页面 present ,然后使用新加载的指令返回虚拟内存位置。将尝试执行该指令。

如果指令访问引用不存在的虚拟内存地址的内存操作数,则它们也会引起其他页面错误。页面处理程序将发生页面错误,页面处理程序将所需数据加载到空闲页面框架中,将其映射到虚拟内存,将虚拟页面标记为 present ,然后返回到导致该页面的指令故障。此时再次重试该指令。

操作系统用于维护页面框架的确切机制;维护页面表和目录;决定从哪里/如何加载数据/代码的实现细节将有所不同。关键是页面错误是将数据/代码加载到虚拟内存页面的主要机制,虚拟内存页面可能已被操作系统标记为不存在。