操作系统在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文件里干了些什么相关推荐

  1. C专家编程 第6章 运动的诗章:运行时数据结构 6.1 a.out及其传说

    运动的诗章:运行时数据结构      编程语言理论的经典对立之一就是代码和数据的区别.有些语言(如Lisp)把二者视为一体.其他语言(如C语言)通常维持两者的区别.Internet蠕虫非常难以被人们所 ...

  2. objective-c 编程总结(第六篇)运行时操作 - 方法交换

    objective-c 编程总结(第六篇)运行时操作 - 方法交换 后面主要介绍oc类的运行时行为.这里面包括运行时方法的更换,消息的转发,以及动态属性.这些对于面向方面编程AOP的热爱者还是很有用的 ...

  3. 《C专家编程》第二章——这不是Bug,而是语言特性

    无论一门语言有多么流行或多么优秀,它总是存在一些问题,C语言也不例外.本章讨论的重点是C语言本身存在的问题,作者煞费苦心的用一个太空任务和软件的故事开头,也用另一个太空任务和软件的故事结尾,引人入胜. ...

  4. C专家编程 第10章 再论指针 10.7 使用指针创建和使用动态数组

    使用指针创建和使用动态数组     当预先并不知道数据的长度时,可以使用动态数组.绝大多数具有数组的编程语言都能够在运行时设置数组的长度.它们允许程序员计算需要处理的元素的数目,然后创建一个刚好能容纳 ...

  5. C专家编程--读书笔记六 运行时数据结构

    第六章 一.知识点 1.代码和数据的区别也可以认为是编译时和运行时的分界线.编译器的绝大部分工作都跟翻译代码有关:必要的数据存储管理的绝大部分都在运行时进行.(P121) 2."a.out& ...

  6. C专家编程 第11章 你懂得C,所以C++不再话下 11.1 初识OOP

    C++之于C,就像Algol-68之于Algol          ---David L.Jones     如果你觉得C++还不够复杂,那你知道protected abstract virtual ...

  7. C专家编程 第1章 C:穿越时空的迷雾 1.4 KR C

    时间:1978 人物:Steve Johnson 事件:编写了pcc这个可移植的C编译器 影响:形成了一代C编译器的基础. C语言的演化之路如图1-2所示. 1973-3(早期的C)--->19 ...

  8. C专家编程 第8章 为什么程序员无法分清万圣节和圣诞节 8.2 根据位模式构筑图形

    根据位模式构筑图形     图标(icon)或者图形(glyph)是一种小型的位模式映射于屏幕后产生的图像.一个位表示图像上的一个像素.如果一个位被设置,那么它所代表的像素就是"亮" ...

  9. 《C专家编程》1-2章阅读收获

    一. C诡异离奇,缺陷重重,却获得了巨大的成功. ·编译器设计:效率(几乎)就是一切.编译器的效率包括两个方面:运行效率(代码的运行速度)和编译效率(产生可执行代码的速度). 除了开发和学习环境外,运 ...

最新文章

  1. 第一个MapReduce程序
  2. centos8安装mongodb5
  3. 浅谈“==”、equals和hashcode,以及map的遍历方法(可用作上一篇k-means博文参考)
  4. STM32F013 十元板
  5. 前端学习(2890):如何短时间内实现v-for 模板编译321
  6. python创建虚拟环境venv_Python 3 使用venv创建虚拟环境
  7. php 写入套节字,php – 写入套接字并处理损坏的管道
  8. 【NER】命名实体识别:详解BiLSTM_CRF_Pytorch_Tutorial代码
  9. ocelot 配置文件的动态更新
  10. docker php安装gd扩展_PHP安装AMQP扩展
  11. nginx 多php项目配置文件,nginx,_nginx配置多目录访问,nginx - phpStudy
  12. 点我—— ASP.NETCORE 安装CentOS
  13. mysql .frm文件丢失_MySQL frm ibd 文件丢失的恢复
  14. 招聘:JAVA软件开发工程师
  15. B,BL指令的使用范围
  16. 魏文王问扁鹊的注释_《魏文王问扁鹊》及翻译
  17. 一意孤行亚马逊----一个钓鱼疯子的巴西亚马逊之行( 12.九月 28日 在营地的最后一天 ) 作者:咸水鱼...
  18. vscode调试nodejs不要太爽啊
  19. 4.25分享(贪心算法基础)
  20. SQLServer链接服务器

热门文章

  1. uniapp canvas 图片加上文字合成一张新图并保存到手机相册
  2. 学大伟业Day1解题报告
  3. C语言求6阶余子式,usdt交易 -usdt交易V3.6.39
  4. 树莓派 电脑 网线对联 桥接及ssh
  5. 如何解决word中latex公式出现虚线小方框问题
  6. 最详细的Android图片压缩攻略
  7. 人脸识别中的活体检测算法综述
  8. P2608 [ZJOI2010]任务安排
  9. 小酷智慧地图3D导览v1.0.87打卡定位 地图打卡
  10. 全新荣耀手表GS 3正式发布,8通道心率AI引擎精准高效管理健康生活