进程地址空间

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<string.h>
  4 
  5 int g_val = 100;
  6 int main()
  7 {
  8     printf("father is running, pid: %d, ppid: %d\n", getpid(), getppid());
  9     pid_t id = fork();
 10     if(id == 0)
 11     {
 12         int cnt = 0;
 13         while(1)
 14         {
 15             printf("I am child process, pid: %d, ppid: %d, g_val: %d, &g_val: %p\n", getpid(), getppid(), g_val, &g_val);
 16             sleep(1);
 17             cnt++;
 18             if(cnt ==5)
 19             {
 20                 g_val = 300;
 21                 printf("I am child proces, change %d -> %d\n", 100, 300);                                                                                
 22             }
 23         }
 24     }
 25     else
 26     {
 27         while(1)
 28         {
 29             printf("I am father process, pid: %d, ppid: %d, g_val: %d, &g_val: %p\n", getpid(), getppid(), g_val, &g_val);
 30             sleep(1);
 31         }
 32     }
 33 }

进程地址空间_第1张图片
该地址为虚拟地址

地址空间的本质就是内核中的一个结构体对象
OS自主完成写时拷贝
如果父子进程不写的?未来一个全局变量,默认是被父子共享的,代码是共享(只读的)

地址空间本质是内核的一个struct结构体,内部很多的属性都是表示start、end的范围struct mm_struct{}

objdump -S myprocess >test.s反汇编到文件
程序里面本身就有地址,虚拟地址(逻辑地址)

你可能感兴趣的:(Linux,linux)