0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

从进程的角度看内存

麦辣鸡腿堡 来源:TrustZone 作者:TrustZone 2023-10-30 18:02 次阅读

在windows下的可执行文件的格式为.exe,而Linux的下的是ELF。这是一种文件格式,就是告诉你文件是怎么存储的。

整个ELF的图看看

图片

这些内容和内核空间定义也差不多。

代码段(.text):程序源代码编译后的机器指令被存放在这个代码段里。

数据段(.data):存放已初始化的全局变量和已初始化的局部静态变量。

bss段(.bss):用来存放未初始化的全局变量以及未初始化的局部静态变量。

写一个程序,其实是依赖很多的其他的程序,因此自己写的程序需要编译链接后才能使用。

时起到辅助作用,暂时先不用关注它们。程序在编译链接时会尽量把相同权限属性的段分配在同一个空间里,例如,把可读可执行的段放在一起,包括代码段、init段等;把可读可写的段放在一起,包括.data段和.bss段等。ELF把这些属性相似并且链接在一起的段叫作分段(Segment),进程在装载时是按照这些分段来映射可执行文件的。

描述这些分段的结构叫作程序头(Program Header),它描述了ELF文件是如何映射到进程地址空间的,这是我们比较关心的。

可以使用objdump或者readelf工具来查看ELF文件包含哪些段。

我们可以通过“readelf -l”命令来查看这些程序头。

在看的时候主要关注LOAD类型的分段,其他的都是在LOAD的时候起到辅助作用。

这是都是静态的。

在如果你想去看看静态的,可以通过proc文件系统来看看Linux内核的运行情况。每个进程运行之后,在/proc/pid/maps节点会列出当前进程的地址映射情况。

图片

第1行中显示了地址0x10000~0x870000这段进程地址空间,它的属性是只读并且可执行的,由此我们知道它是代码段,也就是之前看到的代码段的程序头。

第2行中显示了地址0x96000~0x98000,它的属性是可读可写的进程地址空间,也就是我们之前看到的数据段的程序头。

第 3 行中显示了地址0x98000~0xbb000,这段进程地址空间叫作堆空间(Heap),也就是通常使用malloc分配的内存,大小是140KB。test进程主要使用malloc分配100KB的内存,这里看到Linux内核会分配比100KB稍微大一点的内存空间。

第4行显示test进程的栈(stack)空间。

第5行是Sigpage的进程地址空间,Sigpage是ARM体系结构中特有的页面。

第6行是ARM中高端映射的异常向量(vectors)。

这里说的进程地址空间,在 Linux 内核中使用一个叫作 VMA的术语来描述,它是vm_area_struct数据结构的简称,在虚拟内存管理部分会详细介绍它。另外,/proc/pid/smaps节点会提供更多的地址映射的细节,以代码段的VMA和堆的VMA为例。

另外,/proc/pid/smaps节点会提供更多的地址映射的细节,以代码段的VMA和堆的VMA为例。

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内核
    +关注

    关注

    3

    文章

    1316

    浏览量

    39947
  • Linux
    +关注

    关注

    87

    文章

    11030

    浏览量

    207255
  • 内存
    +关注

    关注

    8

    文章

    2800

    浏览量

    73122
  • 代码
    +关注

    关注

    30

    文章

    4598

    浏览量

    67333
收藏 人收藏

    评论

    相关推荐

    从 Linux 内核的角度谈线程栈和进程

    虚拟地址通过页表(Page Table)映射到物理内存,页表由操作系统维护,并被处理器的内存管理单元(MMU)硬件引用。 每个进程都拥有一套属于它自己的页表,因此对于每个进程而言都好像
    的头像 发表于 09-25 15:23 2348次阅读
    从 Linux 内核的<b class='flag-5'>角度</b>谈线程栈和<b class='flag-5'>进程</b>栈

    Linux下进程间如何实现共享内存通信

    这次我们来讲一下Linux进程通信中重要的通信方式:共享内存作为Linux软件开发攻城狮,进程间通信是必须熟练掌握的重要技能,而共享内存是在程序开发中常用的也是重要的一种
    发表于 04-26 17:14 602次阅读

    Linux内存点滴 用户进程内存空间

    的页框供给缺页异常处理,Linux有一套自己的做法,称为PFRA。PFRA总会用户态进内存程空间和页面缓存中,“窃取”页框满足供给。所谓”窃取”,指的是:将用户进程内存空间对应占用的
    发表于 08-14 16:23

    高端EMC技术资料及案例分析 & 如何EMI角度PCB layout 法规

    高端EMC技术资料及案例分析 & 如何EMI角度PCB layout 法规亚洲资深权威电磁兼容导师http://www.samfong.cn/zhanosheng.html
    发表于 02-19 18:18

    如何EMI角度PCB layout 法规

    ` 如何EMI角度PCB layout 法规如何從EMI角度PCB Layout 法則有以下幾個重點Point 1: 先了解導線或傳輸線的幅射或天線效應 對應國際法規EMI幅射量
    发表于 02-19 18:36

    Linux上对进程进行内存分析和内存泄漏定位

    。(栈)5、采用mmap方式映射到虚拟地址空间中的内存段这是我的机器上,redis 进程的情况,第一行:r-xp可知其权限为只读、可执行,该段内存地址对应于执行文件的代码段,程序的代
    发表于 07-09 08:15

    linux内存进程查看

    用 'top -i' 看看有多少进程处于 Running 状态,可能系统存在内存或 I/O 瓶颈,用 free 看看系统内存使用情况,swap 是否被占用很多,用 iostat 看看 I/O 负载情况...
    发表于 07-16 06:28

    架构的角度如何写好代码 + 我的思考

    架构漫谈(八):架构的角度如何写好代码 + 我的思考
    发表于 06-18 06:16

    如何安全的角度自动驾驶

    安全的角度自动驾驶
    发表于 01-25 06:42

    步进电机驱动IC的角度步进电机

    步进电机驱动IC的角度步进电机,归纳相关知识点。一、单极性与双极性电机: 单极性电机,由单极性IC驱动。其一端接Vcc,另一端由IC控制连接或断开。 而双极性电机,由双极性IC驱动。双端都由IC控制。二、单极性电机的内部结构
    发表于 08-31 06:31

    进程间通信之共享内存

    8.5.1 共享内存概述 可以说,共享内存是一种最为高效的进程间通信方式。因为进程可以直接读写内存,不需要任何数据的复制。为了在多个
    发表于 10-18 16:08 1次下载
    <b class='flag-5'>进程</b>间通信之共享<b class='flag-5'>内存</b>

    Linux0.11-内存组织和进程结构

    在task数组中占有一项,指向一页物理内存,该物理内存低端是进程控制块task_struct(里面包括tss段和ldt段),其余部分是进程的内核态堆栈。
    发表于 05-15 11:16 1048次阅读
    Linux0.11-<b class='flag-5'>内存</b>组织和<b class='flag-5'>进程</b>结构

    Linux下进程内存结构

    Linux操作系统采用虚拟内存管理技术,使得每个进程都有各自互不干涉的进程地址空间。该地址空间是大小为4GB的线性虚拟空间,用户所看到和接触到的都是该虚拟地址,无法看到实际的物理内存
    发表于 06-01 09:17 1391次阅读
    Linux下<b class='flag-5'>进程</b>的<b class='flag-5'>内存</b>结构

    进程虚拟内存布局以及进程的虚拟内存分配释放流程,涉及的代码

    我们计划通过一系列文章来介绍虚拟内存分配/释放,缺页处理,内存压缩/回收,内存分配器等知识,梳理虚拟内存的管理。本章节结合代码介绍进程虚拟
    的头像 发表于 06-28 09:38 3701次阅读

    Linux进程内存消耗和泄漏详解

    当我们评估进程消耗多少内存时,就是指在用户空间消耗的内存,即虚拟地址在0~3G的部分,对应的物理地址内存。内核空间的内存消耗属于内核,系统调
    的头像 发表于 05-14 10:07 2524次阅读
    Linux<b class='flag-5'>进程</b>的<b class='flag-5'>内存</b>消耗和泄漏详解