5

这里有一个操作系统/计算机体系结构问题。我正在阅读有关缓存的内容,关于如何虚拟索引缓存是减少地址转换时间的一种选择。我遇到了以下情况:

"Virtual cache difficulties include:
    Aliasing
        Two different virtual addresses may have the same physical address."

我想不出什么时候会发生这种情况。自从我的 O/S 天以来已经有一段时间了,我正在画一个空白。

有人可以提供一个例子吗?谢谢

4

4 回答 4

7

两个进程可能有一个共享映射。例如,在 Unix 中,可执行代码通常映射到执行同一程序的所有进程之间共享的区域。(事实上​​,一个进程可能有多个相同底层内存的映射,例如当它mmap两次是同一个文件时。)

于 2012-10-13T22:47:09.290 回答
2

我相信程序的可执行部分可以在进程之间共享——因此被映射两次。

例如:如果你加载两个实例vim,就会有两个进程。这两个进程可能会映射到物理内存中的相同可执行代码。

于 2012-10-13T22:49:02.640 回答
2

shmat()是在两个不同进程中将相同物理地址映射为两个不同虚拟地址的典型示例。如果您执行 pmap -x pid_A 。你会看到进程 A 的虚拟内存映射与进程 B 类似。实际的物理内存不会暴露给用户空间程序。

现在 SayProcess A 和 B 共享一个共享内存段,共享内存指针是 sh_mem_ptr_A 和 Sh_mem_ptr_B。如果您打印这些指针,它们的地址(虚拟)将不同。因为sh_mem_ptr_A是进程A的内存映射的一部分,同样sh_mem_ptr_B对于进程B。

内核维护虚拟到物理地址的映射。按页表和偏移量。高位映射到页表,偏移量映射到页表中的偏移量。因此,如果您注意到 sh_mem_ptr_A 和 sh_mem_ptr_B 的低位,它们将是相同的(但可能并非总是如此)。

于 2013-01-31T17:32:06.927 回答
1

此外,每个进程都分配了 4GB 的虚拟空间(在 32 位系统中),其中 1 GB(取决于 Os 到 Os)映射给 OS。由于 OS 对所有进程都是通用的,因此低 1GB 的虚拟地址对所有进程都是通用的,它们映射到相同的 OS 物理页面。

于 2012-10-15T06:45:05.640 回答