【问题标题】:When could 2 virtual addresses map to the same physical address?2 个虚拟地址何时可以映射到同一个物理地址?
【发布时间】:2012-10-04 08:51:43
【问题描述】:

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

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

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

有人可以举个例子吗?谢谢

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 单个进程执行此操作并不少见。例如,想想 .bss 之类的东西。它可以全部映射到使用 COW 语义初始化为零的单个页面。
    • 这对于可执行文件总是(几乎)完成,即使从用户级别使用mmap()shmat()等函数也很容易完成
    【解决方案2】:

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

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

    【讨论】:

    • 好吧,从指令的角度来看这是有道理的,但这里真正的危险(除了缓存中的冗余)是相同的 data 被加载,一个版本被修改。 2个虚拟地址什么时候可以引用同一个程序的物理数据?也许如果 2 个进程都在尝试写入内存映射 I/O 输出?但我不知道它是否被缓存。
    • 这是可能的。另外,我不确定 MPI 和 OpenMP 是如何实现共享内存的,但可能是使用这些实现的。
    • 显然我已经有一段时间没有使用 MPI 了。这使用消息传递,而不是共享内存。
    【解决方案3】:

    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的内存映射的一部分,同样sh_mem_ptr_B对于进程B。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • ...并且拥有相同的地址,以免所有重新映射都违背了自己的目的。
      猜你喜欢
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 2020-02-29
      相关资源
      最近更新 更多