【问题标题】:How are two identical virtual addresses in two processes mapped into different physical addresses?两个进程中的两个相同的虚拟地址如何映射到不同的物理地址?
【发布时间】:2016-09-25 15:56:13
【问题描述】:

例如下面的 C 代码

#include <stdio.h>
int main() {
    unsigned long temp = 0x12345678;
    printf("temp address is %p\n", &temp);
    int* func_addr = (int*)main;
    printf("main address is %p\n", func_addr);
    int i;
    // suspend process
    scanf("%d", &i);
    return 0;
}

在我的机器上编译代码()并在两个终端运行程序,两个进程输出:

流程一:

临时地址是 0xbfcc5350

主地址为0x80484bb

流程2:

临时地址为 0xbf94e5d0

主地址为0x80484bb

我的问题是根据图Linear Address

  1. main的虚拟地址在两个进程中是一样的,我们知道 根据地址,该虚拟地址等于线性地址 从线性地址和物理地址转换,两个相同 虚拟地址应该映射到两个相同的物理地址 地址,但实际上两个主要的物理地址是不同的, 映射过程如何?
  2. temp 在两个进程中的地址是基于页面的,它们的 PGD 部分(高10位)相同(0x2ff),这意味着两个进程 有相同的页表条目?

我的操作系统是 Ubuntu 16.04.1 LTS,32 位。

【问题讨论】:

标签: linux


【解决方案1】:

在您的示例中,两个 main() 物理地址实际上可能相同。因为只读代码段可能会在进程之间共享。但这并不意味着这些进程共享页表。数据部分是可写的,所以每个进程必须有自己的副本,由它自己的页表映射。为什么两个主要的具有相同的VA?可能是为了避免使用重定位修补代码,以便可以共享。

【讨论】:

  • 其实两个main()的物理地址是不一样的,它们的虚拟地址是一样的,只是映射到了不同的物理地址上。
【解决方案2】:

每个进程都有自己的PGD,当它运行时,CR3寄存器存放PGD的物理地址。另外,PAE是否使能,CR3寄存器存放的是PDPT的物理地址。

【讨论】:

    猜你喜欢
    • 2011-03-27
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多