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

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; staticint d=1000; staticint e=0; staticint 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
&lt;一&gt;关于进程虚拟地址空间区域内存划分和布局

文章插图
【<一>关于进程虚拟地址空间区域内存划分和布局】上面红框部分存储在代码段 , 蓝色框部分存储在数据段
注意:不同的进程之间,用户空间是私有的,内核空间是共享的

    推荐阅读