记住:任何编程语言编译之后产生=汇编指令+数据
每一个进程的用户空间是私有的,内核空间是共享的(管道通信的原理)
X86 32为linux环境下,虚拟地址空间结构
只读区:
.text段
:指令段,存放汇编指令
.rodata段
:常量段,存放常量
数据区:
.data段
:存放已初始化且非0的数据
.bss段
:存放未初始化或初始化为0的数据,操作系统会将数据段.bss部分清零
堆区:
.heap
:空闲区,程序动态分配的内存区域
加载共享库区:用来存放加载的动态库
栈区:
.stack
:存放局部变量的值,函数参数和返回值
命令行参数:./a.out 192.168.1.100
环境变量:程序搜索头文件和库文件默认的搜索路径
下面一段代码的分区示例:
或许会疑惑,局部变量为什么属于
.text
指令段,因为局部变量编译之后不会产生符号存入符号表中,只会产生汇编指令(mov dword ptr[a],0Ch
),只有当运行时,才会在栈上开辟四字节空间存放局部变量的值