> 文章列表 > 进程虚拟地址空间划分

进程虚拟地址空间划分

进程虚拟地址空间划分

任何编程语言->产生指令和数据
我们以x86 32位linux 作为知识介绍的背景
编译后生成exe文件在磁盘上,需要加载到内存才能运行
但不能直接加载到物理内存

linux给当前进程分配一个2^32大小的一块空间,4G

虚拟地址空间解释

  • 它存在,你看得见,它是物理
  • 它存在,你看不见,它是透明
  • 它不存在,你看得见,它是虚拟
  • 它不存在,你看不见,它是被删除

进程虚拟地址空间

在这里插入图片描述

.text是代码段,.rodata是只读数据段,存放如字符常量相关的数据,如

char *p = "hello world";*p = 'a'; // error

stack是高地址向低地址生长,heap是低地址向高地址生长

zone_normal pcb(进程控制块)块,内核函数所依赖的栈空间

举个例子,理解数据存在进程虚拟地址空间的哪一部分:

#include "pch.h"
#include <iostream>
using namespace std;int gdata1 = 10; // .data段,已初始化且不为0
int gdata2 = 0;	// .bss段,初始化但为0
int gdata3; // .bss段static int gdata4 = 11; // .data段,已初始化且不为0
static int gdata5 = 0; // .bss段
static int gdata6; // .bss段int main()
{// 下面三行代码是指令mov,不产生负号,存放在.text段int a = 12; // mov dword ptr[a], 0Ch   分4字节空间将12存入其中int b = 0;int c;static int e = 13; // .data段static int f = 0; // .bss段static int g; // .bss段return 0; // .text段
}

每一个进程的用户空间是私有的,但内核空间是共享的

在这里插入图片描述

这也就引出了进程间通信方式中的 匿名管道通信,也就是在内核空间开了一块共享内存