什么时候2个虚拟地址可以映射到同一个物理地址?

时间:2012-10-13 22:46:17

标签: operating-system memory-address cpu-architecture

此处是操作系统/计算机架构问题。我正在阅读有关缓存的内容,关于如何虚拟索引缓存是减少地址转换时间的选项。我发现了以下内容:

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

我无法想到这种情况何时会发生。我的O / S天已经有一段时间了,我正在画一个空白。

有人能提供一个例子吗?感谢

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

现在,SayProcess A和B共享共享内存段,共享内存指针为sh_mem_ptr_A和Sh_mem_ptr_B。 如果你打印这些指针,他们的地址(虚拟)将是不同的。 因为Sh_mem_ptr_A是进程A的内存映射的一部分,所以类似于进程B的sh_mem_ptr_B。

内核维护了虚拟到数据库地址的实现。按页表和偏移量。 较高位映射到页表,偏移映射映射到页表中。因此,如果您注意到sh_mem_ptr_A和sh_mem_ptr_B的低位位,它们将是相同的(但可能始终不是真的)。​​

答案 3 :(得分:1)

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