在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文章
1384浏览量
40458 -
Linux
+关注
关注
87文章
11354浏览量
210659 -
内存
+关注
关注
8文章
3071浏览量
74414 -
代码
+关注
关注
30文章
4841浏览量
69196
发布评论请先 登录
相关推荐
从 Linux 内核的角度谈线程栈和进程栈
![<b class='flag-5'>从</b> Linux 内核的<b class='flag-5'>角度</b>谈线程栈和<b class='flag-5'>进程</b>栈](https://file.elecfans.com/web1/M00/C7/BB/o4YBAF9tmheAABWmAAAfoJgaSB0445.png)
如何从EMI角度看PCB layout 法规
Linux上对进程进行内存分析和内存泄漏定位
从步进电机驱动IC的角度看步进电机
从纯粹软件技术的角度看Windows CE
![<b class='flag-5'>从</b>纯粹软件技术的<b class='flag-5'>角度</b><b class='flag-5'>看</b>Windows CE](https://file.elecfans.com/web1/M00/A8/DF/o4YBAF2RXhmAPXDyAABpaHBq0QQ994.png)
进程虚拟内存布局以及进程的虚拟内存分配释放流程,涉及的代码
从SMT焊接角度看BGA封装的优势
从软件角度看看内存
![<b class='flag-5'>从</b>软件<b class='flag-5'>角度</b>看看<b class='flag-5'>内存</b>](https://file1.elecfans.com/web2/M00/AB/5D/wKgaomU_eJ6ACN9QAAFofOLJDgA119.jpg)
评论