1 装载方式:页映射。操作系统将物理内存划分成页(比如每个页大小16K),可执行文件也按照页划分。每次需要哪个页时就将其装载到物理内存中某个空闲页。若没有空闲页,可以采取一定策略将物理内存中某个页换出。

2 可执行文件装载的过程。

(1)创建虚拟地址空间。分配页目录。这一步是建立虚拟空间到物理空间的映射关系。

(2)读取可执行文件头,建立虚拟空间与可执行文件的映射关系。这个映射关系的作用是以后发生页错误的时候,操作系统能够从这个映射关系中知道缺页在可执行文件中的位置。

(3)将cpu的指令寄存器设置成可执行文件的入口,开始运行。

3 VMA的概念。比如只读的数据放在一个VMA,可读可执行的放在一个VMA,所以VMA是进程虚拟空间的连续一段的称呼。

4 链接视图和执行视图。在可执行文件中,从链接视图来看,是按照section来存储的。因为每个section在加载的时候都是占据若干个页,即使某个section只有几十字节也要占据一个页,这样会造成物理内存的浪费。所以实际上,操作系统将权限相同的section都集中到一起,叫做segment。所以从执行视图来看待可执行文件,它是按照segment来划分的。

5 可执行文件中有很多segment,每条segment的内容包含:

(1)p_type: 类型。其中最主要的一个类型是LOAD。只有这个类型的segment是装载到物理内存的

(2)p_offset:在文件中的偏移

(3)p_vaddr:在进程虚拟空间的偏移

(4)p_filesz:在文件中大小

(5)p_memse:在虚拟进程空间大小(这个跟p_filesz一般是相同的)

(6)p_flags:权限,读,写,执行

(7)p_align:对齐属性

6 堆和栈。除了可执行文件中的segment加载之后是一个个的VMA,还有堆和栈也是两个VMA。堆向上增长,栈向下增长

7 segment的对齐。假设每个页的大小是4096字节。其实,可执行文件中的segment在加载后,并不是每个segment的其实地址都是4096的倍数。因为在有很多segment很小的时候,这样也会造成很大的浪费。实际上是这样做的:将各个segment依次连续存储到物理内存,这样的话,某个物理内存中某个页可能包含两个(或者更多)segment,所以这时候会将这个页映射两次,分别到每个segment在进程虚拟空间对应的VMA。(可执行文件有几个segment,在进程虚拟空间就有就有几个VMA)。

8 linux装载elf可执行文件的过程。首先bash通过fork创建一个进程,新进程调用execve执行的elf。总的流程是,读取文件头,根据魔数判断是elf文件,还是java文件,还是什么脚本文件。如果是elf文件,会调用装载elf的程序,这个程序会得到segment的数量,然后装载,将系统调用的返回地址设置为可执行文件的入口地址。然后返回,可执行文件就开始执行了。

《程序员自我修养》阅读笔记-可执行文件装载与进程相关推荐

  1. 程序员自我修养阅读笔记——可执行文件的装载过程

    1 可执行文件的装载过程 1.1 进程虚拟地址空间   一个可执行文件被装载到内存变成程序后(进程和程序的区别在于一个是静态的一个是动态的,程序就是菜谱,进程就是厨师参考菜谱做菜的过程),拥有自己独立 ...

  2. 程序员自我修养阅读笔记——运行库

    主要关注程序的启动过程. 1 入口函数和程序初始化 1.1 程序真正的入口   通常写代码时,我们认为程序的入口是main函数,但是实际上有一些现象值得我们怀疑该结论是不是正确的.比如全局变量的初始化 ...

  3. 程序员自我修养阅读笔记——动态链接

    1 为什么需要动态链接   动态链接,顾名思义,就是只有在程序需要调用对应的库中的实现时才将对应的库的映像文件加载到内存.相比而言,静态链接是在编译阶段就将需要的目标文件中的相关实现连接到可执行文件中 ...

  4. 程序员自我修养阅读笔记——Linux共享库管理

      有了共享库那么就存在对库版本的管理问题. 1 共享库版本 1.1 共享库兼容   共享库更新时一般会存在两种形式的更新,兼容更新和不兼容更新.这里的兼容不仅仅指接口兼容,也指ABI(Applica ...

  5. 程序员自我修养阅读笔记——系统调用与API

    1 系统调用 1.1 系统调用简介   由操作系统实现提供的所有系统调用所构成的集合即程序接口或应用编程接口(Application Programming Interface,API).是应用程序同 ...

  6. 程序员自我修养学习笔记

    分页 线程 处于运行中线程拥有一段可以执行的时间,这段时间称为时间片(Time Slice),当时间片用尽的时候,该进程将进入就 绪状态.如果在时间片用尽之前进程就开始等待某事件,那么它将进入等待状态 ...

  7. 《程序员自我修养》第七章读书笔记

    书还是接上回,本篇主要对第七章的相关内容进行总结.第七章主要对动态链接的相关内容进行分析. 7.1 为什么要动态链接 既然要对动态链接进行分析,首先应对动态链接出现的原因进行一个简单的分析.动态链接从 ...

  8. 程序员自我修养之链接

    我最近在看PE文件,稍后可能需要dll这些所以顺带看看链接.太久不看这些书,你问我链接是干什么的,我可能会说就是分模块时候用啊,因为一个项目有很多模块,不能写在同一个文件下,所以要把它们链接起来,链接 ...

  9. 程序员自我修养》系统调用与API

    什么是系统调用 在现代的操作系统里,程序运行的时候,本身是没有权利访问多少系统资源的.由于系统有限的资源有可能被多个不同的应用程序同时访问,因此,如果不加以保护,那么各个应用程序难免产生冲突.所以现代 ...

  10. 程序员的自我修养阅读笔记

    编译和链接 将编译和链接合并到一起的过程称为构建(Build). 从源文件生成最终可执行目标文件共有4个步骤: 预处理(Prepressing) 编译(Compilation) 汇编(Assembly ...

最新文章

  1. linux红帽网页中文乱码解决,【linux学习笔记】安装redhat时中文显示乱码(小方框)解决方法...
  2. 西游之路——python全栈——上传文件
  3. 【Linux 内核】实时调度类 ① ( 进程分类 | 实时进程、普通进程 | Linux 内核 SCHED_FIFO、SCHED_RR 调度策略 | 实时调度实体 sched_rt_entity )
  4. Building wheel for wrapt (setup.py) ... error的解决办法(图文)
  5. mybatis 处理参数ListString[]
  6. HBase总结(二十)HBase常用shell命令详细说明
  7. 站在面试官角度,看求职与内卷
  8. AI端部署“三问”:模型如何跑起来、跑得快、持续跑
  9. lombok常用注解使用说明
  10. 重启php7.0-fpm
  11. C陷阱与缺陷阅读笔记(上)
  12. 遇到个别手机前置摄像头相差90度的怪事
  13. Java8日期类型常见用法总结
  14. 打印机显示服务器脱机是什么原因,脱机使用打印机是什么意思?脱机打印机状态显示错误怎么办...
  15. 高仿QQ空间广告位 ——— 一个位置来回切换两张广告图
  16. VSCode折叠所有区域代码快捷键
  17. 海岛奇兵服务器维护中怎么办,海岛奇兵无法更新解决方法介绍
  18. 挑战微信?三大运营商的目的或许不在这
  19. 江西省2021年工业互联网安全技术技能大赛
  20. 2.6.1.3 Packet Tracer - Configure Cisco Routers for Syslog, NTP, and SSH Operations

热门文章

  1. 标识符and名字的作用域
  2. accp8.0转换教材第6章连接MySQL理解与练习
  3. 关于nginx file not found
  4. Python自动化之socket初识
  5. .Net Core Linux centos7行—.net core json 配置文件
  6. Alfresco 4 项目介绍
  7. 可局部放大图片的例子,局部放大图片,javascript局部放大图片
  8. LinkButton回发报错__doPostBack('……','') 缺少对象
  9. Cook‘n Recipe Organizer X3 Mac(食谱管理器)激活版
  10. 苹果Safari中保存的密码如何导入Chrome浏览器?