gpt4 book ai didi

linux - 两个进程中两个相同的虚拟地址如何映射到不同的物理地址?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:17 25 4
gpt4 key购买 nike

例如下面的 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;
}

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

过程 1:

临时地址是0xbfcc5350

主地址是0x80484bb

过程 2:

临时地址是0xbf94e5d0

主地址是0x80484bb

我的问题是基于图 Linear Address :

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

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

最佳答案

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

关于linux - 两个进程中两个相同的虚拟地址如何映射到不同的物理地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39688869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com