【问题标题】:we see virtual address of a process (in paging system), where does these virtual address exist?我们看到进程的虚拟地址(在分页系统中),这些虚拟地址存在于哪里?
【发布时间】:2017-01-25 13:09:18
【问题描述】:

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

【问题讨论】:

  • 我不明白你在问什么,关于“居住”和“现有”的所有这些是什么 - 你是否期望所有可能的地址都有一个庞大的列表?
  • @harold 实际上我想知道虚拟地址的实际位置,它们是驻留在磁盘还是 RAM 中?
  • 无论你把它们放在哪里。它们与其他类型的值没有什么不同。您可能会在寄存器、RAM 中有一些指针,也许其中一些 RAM 会被分页到磁盘中。不过,这是一个奇怪的问题。它与“数组索引所在的位置”相当。
  • @harold 数组索引将驻留在主内存中,但我们看到虚拟地址对应的指令如 mov,store。这些具有虚拟地址的指令驻留在哪里,我们在 gdb 中看到的所有指令是否都有物理框架?
  • 哦,这就是你的意思。你的问题真的非常令人困惑。指令只是被执行的数据。包含指令的典型页面也可以被换出(内核中有一些页面必须永久驻留),但它们通常是可执行文件的内存映射页面,因此它会被删除,因为它已经存在于磁盘。该技巧不是为指令保留的。最后这实际上与地址无关..

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


【解决方案1】:

地址(或任何其他数值)可以存在于 CPU 寄存器、内存和任何其他存储设备中,包括磁盘。但这对您来说可能并不奇怪,您所问的也不是。

如果我们谈论的是 32 位 x86 页面转换,那么页表不包含需要转换为物理地址的虚拟地址。页表只包含物理地址,而不包含虚拟地址。不需要在页表中存储虚拟地址。

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

【讨论】:

  • 好的,但是假设在 0x80123456 mov reg1,reg2 是我们在 .text 部分中要执行的第一条指令,0x80123456 是否会出现页面错误,因为它是对应于的第一条指令或物理帧0x80123 虚拟页面已经加载到系统中?如果会出现页面页面错误,那么我们如何看到 mov reg1,reg2 指令,因为没有为它分配物理框架,我们如何在没有物理加载的情况下看到 .text 节指令?
  • @user156991 如果您在内存中看到某些内容(代码或数据),则表示相应的虚拟地址已映射到物理地址,并且某些内容已在某个时刻加载/写入底层物理内存。它可以由操作系统自动/按需完成,特别是当您对文件进行内存映射时(页面错误会告诉操作系统进行映射和加载)。它可以通过要求操作系统(通过系统调用)分配内存(分配物理内存并将虚拟地址空间映射到它)然后将文件内容加载到其中来“手动”完成。
【解决方案2】:

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

【讨论】:

  • @FUZxxi 我们在 gdb 中看到指令,是否所有指令都存在于物理上,或者我们只是从磁盘中看到它,操作系统因当前正在执行的指令而出现页面错误(考虑没有 LOAD、STORE 的情况)。
  • 这是定义的实现。这些指令在某个时候被加载到 RAM 中,但它们可能已经被换掉了。
【解决方案3】:

回答您与 x86 相关的问题的总体简化可能是这样的:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-10
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 2012-04-22
    • 2011-08-20
    • 2015-05-04
    相关资源
    最近更新 更多