【发布时间】: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:
- main的虚拟地址在两个进程中是一样的,我们知道 根据地址,该虚拟地址等于线性地址 从线性地址和物理地址转换,两个相同 虚拟地址应该映射到两个相同的物理地址 地址,但实际上两个主要的物理地址是不同的, 映射过程如何?
- temp 在两个进程中的地址是基于页面的,它们的 PGD 部分(高10位)相同(0x2ff),这意味着两个进程 有相同的页表条目?
我的操作系统是 Ubuntu 16.04.1 LTS,32 位。
【问题讨论】:
-
CR3 对于每个进程都是不同的。
-
@ninjalj 是对的,每个进程都有其 PGD,在 kernel.org 上进行了描述
标签: linux