此文也可看作是Linux下C程序的内存空间布局(虚拟地址),因为在Linux下的C编译器本质上也是一个进程,编译器再强大也得在操作系统的保护模式下运行。
内存空间布局
在Linux中,进程的内存空间按低地址到高地址的顺序分为:代码段text、数据段data、bss段、堆、栈和内核数据区(命令行参数和环境变量等)。如下图所示:
从C程序的角度来说,低地址的三块内存区域由编译器和链接器规划地址空间,在程序被操作系统加载之前它们地址就固定了。堆和栈是可增长的,它们的增长方向相对,堆向上增长,栈向下增长。
C程序的处理过程大体分为4个阶段:预处理、编译、汇编、链接。在汇编语言中,伪指令section和segment的作用相同,都是人为地将代码划分为逻辑块。但在程序处理种这两者不同:在汇编阶段,编译器会将汇编源程序中用section和segment关键字进行逻辑划分的指令或数据区域编译成节(section),生成在目标文件中;而segment则是链接器将目标文件中属性相同的多个section合并后的section集合,并生成可执行文件。内存中的数据段、代码段就是指合并后的segment。
对于操作系统,它只关心程序中这些节的属性是什么,因为它在分配内存时要为这些段分配合适的