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

we see virtual address of a process (in paging system), where does these virtual address exist?

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

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

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

如果我们谈论的是 32 位 x86 页面转换,那么页面 table 不包含要转换为物理地址的虚拟地址。页 tables 仅包含物理地址,但不包含虚拟地址。不需要在页面 tables.

内存储虚拟地址

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

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

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

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

OS 用于维护页面框架的确切机制;维护页表和目录;决定 where/how 从不同的实现细节加载 data/code。关键是页面错误是将 data/code 加载到可能已被 OS.

标记为不存在的虚拟内存页面的主要机制。