目录
1.程序地址空间布局
2.进程地址空间
设置一个全局变量val,可以看到在父子进程中,val的地址是相同的,但是存放的值却是不同的。这是因为当前的地址不是物理地址,而是虚拟地址。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int val = 10;
int main()
{
pid_t id = fork();
if(id < 0)
{
perror("fork");
return 0;
}
else if(id == 0)
{
//child
g_val=20;
printf("child:%d,val:%d,&val:%p\n", getpid(), val, &val);
}
else
{
//parent
sleep(3);
printf("parent:%d,val:%d,&val:%p\n"", getpid(), val, &val);
}
sleep(1);
return 0;
}
3.分页
同一个变量的地址相同,其实是他们的虚拟空间相同。当其中一个变量的值发生拷贝时,会进行写时拷贝,子进程映射到实际的物理空间时与原先父进程存放的相同变量的位置就不同了。
总结
由此可知,一个进程不仅包括PCB(task_struct)和代码,还需要有mm_struct的虚拟地址空间,和一个页表用来将进程虚拟地址映射到实际物理内存。