<一>关于进程虚拟地址空间区域内存划分和布局

C++代码在编译完成后会生产.exe程序(windows平台), .EXE以文件的形式存储在磁盘上,当运行.exe程序的时候
操作系统会将磁盘上的.exe文件加载到内存中,那么在加载到内存中的时候,操作系统是如何在内存中存放这个exe程序的?
有没有区域的划分?那么是如何划分的?
首先需要了解一点,程序加载到内存中,是不能直接加载到物理内存中的

现在我们以 X86平台的Linux 环境举例
当我们一个程序(进程)在启动执行时,操作系统会为其分配一个4G(2的32次方)的内存空间(就是进程的虚拟内存地址空间)

如下图内存分配图

点击查看代码
#incclude <iostrea>
using namespace std;

int gdata1=1;
int gdata2=0;
int gdata3;

static int gdata4=10;
static int gdata5=0;
static int gdata6;
int main(){
	
	int a=100;
	int b=0;
	int c;
	
	static  int d=1000;
	static  int e=0;
	static  int f;	
	return 0;	
}

如上面代码中的全局变量
gdata1,gdata2,gdata3,gdata4,gdata5,gdata6
无论是普通的还是静态的,他们都叫”数据”,每一个数据在编译后,在符号表中都会产生符号.
gdata1和gdata4 初始化了的,而且值部不为0,所以存储在.data段
gdata2和gdata5 初始化了,但是值为0,所以存储在.bss段
gdata3和gdata6 未初始化,存储在.bss段

main 函数中的 a,b,c 不是数据,不会在符号表中产生符号,他们编译只产生指令
例如:move dword prt[a], och ,他们是存储在.text段,当程序运行到这里时,他们是在栈上分配空间的

对于静态的局部变量 如 d,e,f 也是数据,存放在数据段,也会在符号表中产生符号,
程序启动的时候不会初始化,而是在第一次运行到的时候才会初始化, d存储在.data段,e,f存储在.bss段

打印C的值,是一个栈上的随机值,打印f,由于存储在.bss段,系统会负责为.bss段做初始化,置0,所以打印出来f为0

上面红框部分存储在代码段,蓝色框部分存储在数据段

注意:不同的进程之间,用户空间是私有的,内核空间是共享的

Tags: