Linux进程的内存空间布局

Linux进程的内存空间从低地址到高地址依次包括代码段、数据段、BSS段、堆、栈和内核数据区。BSS段存放未初始化的全局变量和静态变量,其在程序执行前自动清零。文章详细阐述了内存布局、C程序处理的四个阶段以及节与段的区别,强调了BSS在内存中的重要角色。
摘要由CSDN通过智能技术生成

       此文也可看作是Linux下C程序的内存空间布局(虚拟地址),因为在Linux下的C编译器本质上也是一个进程,编译器再强大也得在操作系统的保护模式下运行。

内存空间布局

       在Linux中,进程的内存空间按低地址到高地址的顺序分为:代码段text、数据段data、bss段、堆、栈和内核数据区(命令行参数和环境变量等)。如下图所示:

       从C程序的角度来说,低地址的三块内存区域由编译器和链接器规划地址空间,在程序被操作系统加载之前它们地址就固定了。堆和栈是可增长的,它们的增长方向相对,堆向上增长,栈向下增长。

       C程序的处理过程大体分为4个阶段:预处理、编译、汇编、链接。在汇编语言中,伪指令section和segment的作用相同,都是人为地将代码划分为逻辑块。但在程序处理种这两者不同:在汇编阶段,编译器会将汇编源程序中用section和segment关键字进行逻辑划分的指令或数据区域编译成节(section),生成在目标文件中;而segment则是链接器将目标文件中属性相同的多个section合并后的section集合,并生成可执行文件。内存中的数据段、代码段就是指合并后的segment。       

       对于操作系统,它只关心程序中这些节的属性是什么,因为它在分配内存时要为这些段分配合适的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值