博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux应用程序在内存地址布局
阅读量:4284 次
发布时间:2019-05-27

本文共 679 字,大约阅读时间需要 2 分钟。

一个典型的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 程序名
你可能感兴趣的文章
pthread man page
查看>>
Linux 如何修改 root 密碼
查看>>
nc 傳輸
查看>>
vi 與 vim 的指令整理
查看>>
console & telnet判斷
查看>>
sqlite3
查看>>
關於如何快速切換目錄(Linux)
查看>>
Save Time with minicom macros
查看>>
svn : how to set the executable bit on a file?
查看>>
vim 取代指令
查看>>
git 修改過檔案後,如何commit上server
查看>>
git log 應用
查看>>
Git 版本控制系統(3) 還沒 push 前可以做的事
查看>>
Git 基礎 - 檢視提交的歷史記錄
查看>>
wifi 連ap command
查看>>
git clean reset checkout
查看>>
[轉載]6個超強網站讓你查到最道地的英文
查看>>
HUB 與 Switch 差別
查看>>
linux產生 core dump文件方法及設置
查看>>
How to pass macro definition from “makefile” command line arguments to C source code?
查看>>