进程的虚拟空间划分
任何编程语言,都会产生两样东西,指令和数据。
.exe程序运行的时候会从磁盘被加载到内存中,但是不能直接加载到物理内存中。Linux会给当前进程分配一块空间,比如x86 32位linux环境下会给进程分配2^32(4G)大小的空间,这个空间被叫做【进程的虚拟地址空间】,进程的虚拟地址空间其实并不存在,从底层来看它不过是内核创建的一系列数据结构而已。
以x86 32位linux为例,讲解进程的虚拟地址空间:这部分空间默认首地址是0x00000000,尾地址是0xFFFFFFFF,以0xCCCCCCCC为界被划分为两块,0x00000000~0xCCCCCCCC是【用户空间】,0xCCCCCCCC~0xFFFFFFFF是【内核空间】。
用户空间被进一步划分,0x00000000~0x08048000是不允许访问的空间。往后就是.【text段】,用于存储程序的机器代码(即已编译的指令),其中还有一部分是,rodata段(readonly data),用于存放只读数据(比如char *p=“hello”,所以不能修改)。
再往下就是.data段(专门存放初始化并且初始化不为0的数据),和.bss段&#x