C专家编程 第6章 运动的诗章:运行时数据结构 6.3 操作系统在a.out文件里干了些什么
操作系统在a.out文件里干了些什么
为什么a.out要以段的形式组织。段可以方便地映射到链接器在运行时可以直接载入的对象中!载入器只是取文件中的每个段的映像,并直接将它们放入到内存中。从本质上说,段在正在执行的程序中是一块内存区域,每个区域都有特定的目的。
a.out文件 进程的地址空间
最高内存地址
a.out神奇数字 堆栈段(函数的局部数据)
a.out的其他内容
BSS段所需的大小(1) 空洞
BSS段(未初始化的数据)(1)
数据段(2) 数据段(经过初始化的数据)(2)
经过初始化后的全局和静态变量
文本段(3) 文本段(指令)(3)
可执行文段的指令
未映射区域
最低内存地址
图6-2 可执行文件中的段在内存中如何布局
文本段包含程序的指令。链接器把指令直接从文件复制到内存中(一般调用mmap()系统调用),以后便再也不用管它。因为在典型情况下,程序的文本无论是内容还是大小都不会改变。有些操作系统和链接器甚至可以向段中不同的section赋予适当的属性。例如,文本可以被设置为read-and_execute-only(只允许读和执行),有些数据可以被设置成read-write-no-execute(允许读和写,但不允许执行)而另外一些数据则被设置成read-only(只读)等。
数据段包含经过初始化的全局和静态变量以及它们的值。BSS段的大小从可执行文件中得到,然后链接器得到这个大小的内存块,并把它紧放在数据段之后。当这个内存区进入程序的地址空间后全部清零。包括数据段和BSS段的整个区段此时通常统称为数据区。这是因为在操作系统的内存管理术语中,段就是一片连续的虚拟地址,所以相邻的段被结合起来。一般情况下,在任何进程中数据段是最大的段。
我们需要一些内存空间,用于保存局部变量、临时数据、传递到函数中的参数等。堆栈段(stack segment)就是用于这个目的。我们还需要堆(heap)空间,用于动态分配的内存。只要调用malloc()函数,就可以根据需要在堆上分配内存。
注意虚拟地址的最低部分未被映射。也就是说,它位于进程的地址空间内,但并未赋予物理地址,所以任何对它的引用都是非法的。在典型情况下,它是从地址零开始的几K字节。它用于捕捉使用空指针和小整型值的指针引用内存情况。
当考虑共享库时,进程的地址空间的样子如图6-3所示。
最高地址
堆栈
堆栈限制
---堆栈限制
链接器
---另一块未映射的段
{数据
文本
数据
文本} ---共享库被映射到这里
---空洞(未映射区域)
{数据
文本} ---由正在执行的程序使用
---第0页未被映射
最低地址
图6-3 显示共享库的虚拟地址空间布局
C专家编程 第6章 运动的诗章:运行时数据结构 6.3 操作系统在a.out文件里干了些什么相关推荐
- C专家编程 第6章 运动的诗章:运行时数据结构 6.1 a.out及其传说
运动的诗章:运行时数据结构 编程语言理论的经典对立之一就是代码和数据的区别.有些语言(如Lisp)把二者视为一体.其他语言(如C语言)通常维持两者的区别.Internet蠕虫非常难以被人们所 ...
- objective-c 编程总结(第六篇)运行时操作 - 方法交换
objective-c 编程总结(第六篇)运行时操作 - 方法交换 后面主要介绍oc类的运行时行为.这里面包括运行时方法的更换,消息的转发,以及动态属性.这些对于面向方面编程AOP的热爱者还是很有用的 ...
- 《C专家编程》第二章——这不是Bug,而是语言特性
无论一门语言有多么流行或多么优秀,它总是存在一些问题,C语言也不例外.本章讨论的重点是C语言本身存在的问题,作者煞费苦心的用一个太空任务和软件的故事开头,也用另一个太空任务和软件的故事结尾,引人入胜. ...
- C专家编程 第10章 再论指针 10.7 使用指针创建和使用动态数组
使用指针创建和使用动态数组 当预先并不知道数据的长度时,可以使用动态数组.绝大多数具有数组的编程语言都能够在运行时设置数组的长度.它们允许程序员计算需要处理的元素的数目,然后创建一个刚好能容纳 ...
- C专家编程--读书笔记六 运行时数据结构
第六章 一.知识点 1.代码和数据的区别也可以认为是编译时和运行时的分界线.编译器的绝大部分工作都跟翻译代码有关:必要的数据存储管理的绝大部分都在运行时进行.(P121) 2."a.out& ...
- C专家编程 第11章 你懂得C,所以C++不再话下 11.1 初识OOP
C++之于C,就像Algol-68之于Algol ---David L.Jones 如果你觉得C++还不够复杂,那你知道protected abstract virtual ...
- C专家编程 第1章 C:穿越时空的迷雾 1.4 KR C
时间:1978 人物:Steve Johnson 事件:编写了pcc这个可移植的C编译器 影响:形成了一代C编译器的基础. C语言的演化之路如图1-2所示. 1973-3(早期的C)--->19 ...
- C专家编程 第8章 为什么程序员无法分清万圣节和圣诞节 8.2 根据位模式构筑图形
根据位模式构筑图形 图标(icon)或者图形(glyph)是一种小型的位模式映射于屏幕后产生的图像.一个位表示图像上的一个像素.如果一个位被设置,那么它所代表的像素就是"亮" ...
- 《C专家编程》1-2章阅读收获
一. C诡异离奇,缺陷重重,却获得了巨大的成功. ·编译器设计:效率(几乎)就是一切.编译器的效率包括两个方面:运行效率(代码的运行速度)和编译效率(产生可执行代码的速度). 除了开发和学习环境外,运 ...
最新文章
- 第一个MapReduce程序
- centos8安装mongodb5
- 浅谈“==”、equals和hashcode,以及map的遍历方法(可用作上一篇k-means博文参考)
- STM32F013 十元板
- 前端学习(2890):如何短时间内实现v-for 模板编译321
- python创建虚拟环境venv_Python 3 使用venv创建虚拟环境
- php 写入套节字,php – 写入套接字并处理损坏的管道
- 【NER】命名实体识别:详解BiLSTM_CRF_Pytorch_Tutorial代码
- ocelot 配置文件的动态更新
- docker php安装gd扩展_PHP安装AMQP扩展
- nginx 多php项目配置文件,nginx,_nginx配置多目录访问,nginx - phpStudy
- 点我—— ASP.NETCORE 安装CentOS
- mysql .frm文件丢失_MySQL frm ibd 文件丢失的恢复
- 招聘:JAVA软件开发工程师
- B,BL指令的使用范围
- 魏文王问扁鹊的注释_《魏文王问扁鹊》及翻译
- 一意孤行亚马逊----一个钓鱼疯子的巴西亚马逊之行( 12.九月 28日 在营地的最后一天 ) 作者:咸水鱼...
- vscode调试nodejs不要太爽啊
- 4.25分享(贪心算法基础)
- SQLServer链接服务器