《深入了解计算机系统》第七章读书笔记

《深入了解计算机系统》第七章读书笔记

第一部分:链接

链接定义:链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或被拷贝)到存储并执行。

第二部分:目标文件

目标文件:目标文件用以存放目标代码和由编译器或汇编器生成的相关数据的计算机文件格式称为目标文件格式。

目标文件格式有许多不同的种类。最初每种类型计算机都拥有自身独特的格式,但随着Unix和其他可移植操作系统的问世,人们定义了例如COFF和ELF这些格式,并在不同的系统上使用它们。通常,链接器的输入和输出使用相同的文件格式,库文件和可执行文件格式也是一样使用相同的格式。

包含格式:可重定位目标文件,可执行目标文件,共享目标文件。

格式:

处理目标文件常用工具:

STRINGS,NM,SIZE,OBJDUMP等

第三部分:符号

符号与符号表

结构C版本:

typedef struct{
    int name;   //字符串表中的字节偏移,指向符号的以NULL结尾的名字
    int value;  //符号的地址,对于可重定位的模块是距定义目标的节起始位置的偏移。
    int size;   //目标大小(单位:字节)
    char type:4,    //数据或函数
         binding:4; //本地LOCAL/全局GLOBAL
    char reserved;
    char section;   //到节头部表的索引
}Elf_Symbol;

符号解析:

运用方式大致为:

1 判断文件类型

2 对应表找符号解析

3 文件扫描,是否需要重定位(是否能解析)构建可执行文件

4 库运用(一般是将库放在命令行的结尾),如果各个库的成员是相互独立(也就是说没有成员引用另一个成员定义的符号),那么这些库就可以按照任何顺序放置在命令行的结尾处

重定位:

重定位就是把程序的逻辑地址空间变换成内存中的实际物理地址空间的过程,也就是说在装入时对目标程序中指令和数据的修改过程。他是实现多道程序在内存中同时运行的基础。重定位有两种,分别是动态重定位与静态重定位。

重定位是由操作系统安排的。在装入程序前,系统会计算未使用的内存,然后将程序装入,并记下开始地址。在执行有相对地址的指令时,会将所有的地址加个刚才记下的开始地址,就叫重定位。

1、静态重定位:

即在程序装入内存的过程中完成,是指在程序开始运行前,程序中的各个地址有关的项均已完成重定位,地址变换通常是在装入时一次完成的,以后不再改变,故成为静态重定位。

2、动态重定位:

它不是在程序装入内存时完成的,而是CPU每次访问内存时 由动态地址变换机构(硬件)自动进行把相对地址转换为绝对地址。动态重定位需要软件和硬件相互配合完成。

将逻辑地址空间重定位到物理地址空间的时机有三种:

1、程序编译连接时。

2、程序装入内存时。

3、程序执行时。

总结:

第一个阶段预处理在正式的编译阶段之前进行。预处理阶段将根据已放置在文件中的预处理指令来修改源文件的内容。#include指令就是一个预处理指令,它把头文件的内容添加到.cpp文件中还有其他许多预处理指令,第二个是链接程序阶段把所有对象文件中的机器码组合在一起,并解析它们之间的交叉引用。它还集成了对象模块所使用的库函数的代码。实际上有些链接是动态的,即这些链接是在程序执行时建立的。链接程序静态地建立函数之间的链接,即在程序执行之前建立组成程序的源文件中所包含的函数链接。

时间: 2024-10-10 08:20:00

《深入了解计算机系统》第七章读书笔记的相关文章

第七章读书笔记《深入理解计算机系统》

第七章 读书笔记<深入理解计算机系统> 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或拷贝)到存储器并执行. 链接可以执行于编译时,也就是在源代码被翻译成机器代码时:也可以执行于加载时,也就是在程序被加载器加载到存储器并执行时:甚至执行于运行时,由应用程序来执行. 在早期的计算机系统中,链接是手动执行的.在现代系统中,链接是由叫链接器的自动执行的. 7.1 编译器驱动程序 1.大部分编译系统提供编译驱动程序:代表用户在需要时调用语言预处理器.编译器.汇编器

Android深度探索——第七章读书笔记及心得

控制发光二极管 ——第七章读书笔记及心得 通过本章的学习掌握了一个真正和硬件打交道的linux驱动程序.知道了一个完整的linux驱动只要由内部处理与硬件交互两部分组成.其中的内部处理指linux驱动的装载.卸载.与设备文件相关的动作处理以及业务逻辑.与硬件交互主要是指通过部分函数与硬件中的寄存函数进行数据交互. Linux驱动直接与硬件打交道,但是并不是linux启动直接向硬件中的内存写数据,而是与本机的I/O内存进行交互.每一个连接linux的硬件在I/O内存中都会有映射首地址. 创建LED

20150206读书笔记&lt;深入理解计算机系统&gt;

●第一章 C是系统级编程的首选.C++显示支持抽象,属于应用级程序设计语言. 简单例子: 一个典型系统的硬件组成: 存储器的层次结构: 注:存储器层次结构的设计思想是,该层存储器作为下一层存储器的高速缓存 总结:计算机系统的一个重大主题就是提供不同层次的抽象表示,来隐藏实际实现的复杂性.  操作系统内核是应用程序和硬件之间的媒介.提供3个基本的抽象: (1)文件是对I/O设备的抽象 (2)虚拟存储器是对主存和磁盘的抽象 (3)进程是对处理器,I/O设备和主存的抽象. 虚拟机是对整个计算机(操作系

《Linux内核设计与实现》第七章读书笔记

第七章 链接 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或拷贝)到存储器并执行. 链接可以执行于编译时,也就是在源代码被翻译成机器代码时:也可以执行于加载时,也就是在程序被加载器加载到存储器并执行时:甚至执行于运行时,由应用程序来执行. 在早期的计算机系统中,链接是手动执行的.在现代系统中,链接是由叫链接器的自动执行的. 7.1 编译器驱动程序 大多数编译系统提供编译驱动程序,它代表用户在需要时调用语言预处理器.编译器.汇编器和链接器. 例子: 函数mai

软件工程 六、七章读书笔记

第六章 在第六章中主要是介绍了Scrum的方法论,在此方法的理论中,其原则主要强调了一个团队的互动互助的开发过程,重点强调了在一个项目里,一个团队是如何通过沟通产生进步,且这个沟通绝不是说有通信便可称之为“沟通”了,而是要有面对面的实时交流,虽然现在的通讯方式早已变得十分强大,但面对面的沟通仍是最有效率的交流方式,故而在此基础上又提出了一个新的团队合作活动——“每日立会”,这是在Sprint中我认为是十分有效的一个活动,将问题摆在明面上,大家互相了解各自的进度,一起解决项目中的问题,持续更新团队

JavaScript高级程序设计(第3版)第七章读书笔记

第七章 函数表达式 1. 函数声明有一个重要特征 ,函数声明提升.即在执行代码之前会先读取函数声明,意味着可以把函数声明放在调用它的语句后面. 2. 使用arguments.callee实现对函数的递归调用.但在严格模式下,不能通过脚本访问arguments.callee,但可以使用命名函数表达式来达成相同的效果. 3. 闭包是指有权访问另一个函数作用域中的变量的函数.创建闭包的常用方式,就是在一个函数内部创建另一个函数. 4. 由于闭包会携带包含它的函数的作用域,因此会比其他函数占更多的内存.

《现代前端技术解析》第七章读书笔记

<现代前端技术解析>是张成文写的一本书,2017年4月出版的.先看的最后一章(第七章),第七章主要讲的是未来前端技术的发展趋势及如何成为一名优秀的前端工程师. 过去几年,前端主流技术框架发展极快,在填补了原有技术框架空白和不足的同时也渐渐趋于成熟.未来前端的发展方向主要是等待下一个风口的到来,可能是VR丶人工智能或者其他.就前端应用开发方向来讲,MVVM丶Virtual DOM和同构的技术解决方案依然会延续发展一段时间,而且这段时间内前端框架技术的变化将不会像原来一样具有颠覆性.当MVVM丶V

《深入理解计算机系统》第七章读书笔记

连接 1.连接:将各种代码和数据部分收集起来并组合成为一个单一文件的过程.这个文件可被加载或拷贝到存储器并执行. 2.连接可以执行于编译时,也就是在源代码被翻译成机器代码.也可以执行于加载时,也就是程序被加载器加载到存储器并执行时执行于运行时,有应用程序来执行. 3.连接是由链接器的程序自动执行的. 4.连接使分离编译成为可能. 1.编译器驱动程序 1.大部分编译系统提供编译驱动程序:代表用户在需要时调用语言预处理器.编译器.汇编器和链接器.    (1)C预处理器:源程序main.c->ASC

20150207读书笔记&lt;深入理解计算机系统2-1&gt;

第二章 信息存储 (1)  多数计算机以一个字节作为最小可寻址的存储器单元. 机器级程序将存储器看成一个非常大的字节数组,称为虚拟存储器. 存储器的每个字节都由唯一的数字标识,称为它的地址. 所有可能地址的集合称为虚拟地址空间.        扩充:C语言中一个指针的值,无论它是指向一个整数,一个结构或是某个其他程序的对象,都是指针指向的存储块的第一个字节的虚拟地址.        C编译器还将每个指针和类型信息联系起来,这样就可以根据指针值的类型,生成不同的机器级代码来访问存储在指针指向位置的