Linux应用程序在内存地址布局

一个典型的Linux C程序内存空间由如下几部分组成:
代码段(.text:这里存放代码、全局常量(const)、字符串常量。代码段是可共享的,相同的代码在内存中只会有一个拷贝,同时这个段是只读可执行的,防止程序由于错误而修改自身的指令。

初始化数据段(.data:这里存放的是程序中已初始化的全局变量和初始化的静态变量(全局以及局部的)。
未初始化数据段(.bss:存放的是未初始化的全局变量和未初始化的静态变量。位于这一段中的数据,内核在执行该程序前,将其初始化为0或者null
堆(Heap:这个段用于在程序中进行动态内存申请,例如经常用到的mallocnew系列函数就是从这个段中申请内存。
栈(Stack:函数中的局部变量(不包括静态变量)以及局部只读变量(const)保存在此段中。

当一个Linux应用程序在内存中运行时,以上几部分在内存中的布局如下:
   
1.从低地址到高地址为代码段,数据段,bss段,堆,栈;
2.堆向高内存地址生长;
3.栈向低内存地址生长;
4.Linux应用程序的初始地址都是0x8048000,该地址是一个虚拟地址 

查看程序各段地址
运行程序后,可通过以下指令查看程序各段地址:
①ps aux     #查看运行程序的PID号,假设PID号为3098;
②cat /proc/3098/maps  #打印maps

 从上图可以看出代码区从0x08048000到0x08049000.
但以上操作无法看到bss段,因为这里显示的是广义的数据段,已经包含了bss段。
分析bss段的指令为:readelf -S 程序名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值