`
飘零羽
  • 浏览: 26692 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

操作系统学习笔记-链接

OS 
阅读更多

    对于我们经过信心苦苦开发过后完成的代码往往需要经过编译,汇编,链接之后才能形成可执行的代码。其中链接过程指的是将程序所需要的代码与资源集成到一个可执行文件中的过程。其中链接过程能够发生在编译过程中,加载时和运行时,在这三种情况下的链接过程都有一定的差别。并且这三种链接过程与连接器处理的三种目标文件类型相关,他们分别为可重定位的目标文件,可执行的目标文件和共享的目标文件。下面来详细分析三种链接过程。

    首先对于发生在编译过程中的链接过程,这也是在编码之后经常会用到的链接过程,经过编译之后的文件被组织成了可重定位的目标文件格式。对于每个可重定位的目标文件,代码,数据,声明等信息以分段的形式存储于目标文件中。其中代码存储于代码段中,对应于全局变量或者方法的引用在这里被作为符号存储于符号段中,诸如此类各种信息呗存储于其所对应的段中。链接过程首先要做的便是进行符号的解析。所谓的符号解析过程便是将代码中的全局变量,方法等对应到符号表中的具体符号,以便后期利用符号替换为真正的内存地址。在完成符号的解析过程后便可以进行重定位,首先将各个目标文件的各个分段合并成一个,形成一个单独的可执行目标文件,之后便能够为符号表中的各个符号制定内存地址,这样之后每个全局变量,全局方法都会有自身的内存地址。最后将真实的变量和方法的引用替换为主存储器的地址便完成了整个连接过程,这样在可执行目标文件执行的过程中就能够直接利用主存储器地址运行相应的代码或者读取所需变量的值了。在这过程中不难发现一个问题,既然是先进行编译之后才进行连接,那么对于全局变量或者方法的非本地连接在编译过程中如何处理。编译器采取的策略是利用被称为重定位条目的数据结构在相应的引用处起到一个占位符号的作用,在连接完成之后进行替换。

    在实际的应用中编译过程连接并不能完全满足我们的需要,动态连接共享库在实际应用中广泛使用。人们将常用的功能或者代码编译好之后使之以共享目标文件的形式存在,再将多个共享目标文件打包形成共享库,在编写的代码中只需要引用共享库中的功能,但是在编译连接过程中并不把共享库中的代码连接致可执行目标文件中,而是在可执行目标文件载入内存时根据引用的内容在内存中将共享目标文件载入某个特定段中,这时再利用重定位条目重定位对于共享目标文件的引用,使之能够访问对应的引用,这样在运行时就能完整的完成程序的功能,而且有效的节省了主存储器的空间。这种连接过程便是加载时连接。

    最后一种连接形式更为灵活,那就是在运行时进行连接。运行时连接所涉及到的主要内容便是与位置无关代码,由于已经存在于内存中的程序需要对另一共享目标文件进行引用,然而此时目标文件有可能并未加载至内存,所以自然无法得知引用地址,但这时可以将共享目标文件加载,其内部代码是与位置无关的,所谓的与位置无关指的是代码内任何数据的存储地址与其代码值的差值是固定的,此时仅需维护一个每个变量位置与代码位置差值表,因此仅仅需要根据当前PC值利用这个差值进行一步转换便能够得到真正的目标地址,然而每次访问变量都进行一次转换显然增加了系统的负担,因此系统维护了另外一个变量与其绝对地址的映射表,当第一次访问特定变量之后其绝对地址便会存储致表中,之后的访问只需查找这个映射表即可。

    以上便是对全部连接过程的理解,所需注意的地方便是加载时连接,其连接顺序是根据命令从左向右进行连接,所以共享目标文件一定要在最后,否则会出现连接错误。

 

分享到:
评论

相关推荐

    linux学习笔记-01linux操作基础

    ### Linux学习笔记—01 Linux操作基础 #### 1. Linux 基础命令与用法 在Linux操作系统中,掌握一系列的基础命令是非常重要的。这些命令可以帮助用户进行各种日常操作,比如文件管理、目录切换、文件查看等。下面将...

    linux学习笔记--很经典

    本篇“Linux学习笔记”详细介绍了Linux的基本目录结构及其各自的功能,这对于初学者理解Linux系统的核心概念非常重要。 #### 二、Linux目录结构解析 1. **/(根目录)** - 根目录是Linux文件系统的起点,所有的...

    ARM嵌入式系统技术笔记-基于LPC2300上

    此外,书中还会涉及实时操作系统(RTOS)的概念和选择,因为RTOS是许多嵌入式系统的核心部分。可能会讨论FreeRTOS这样的轻量级RTOS在LPC2300上的移植和应用,以及如何利用RTOS来管理和调度任务,提高系统的并发性和...

    B站王道操作系统学习笔记.pdf

    《B站王道操作系统学习笔记》是一份系统阐述操作系统的文档,涵盖了进程管理、内存管理、文件管理等多个关键领域。操作系统作为计算机系统的核心软件,负责管理和控制计算机系统中的各种硬件资源和软件资源,提供给...

    学习笔记-深入理解计算机系统-第一章.7z

    《深入理解计算机系统》是计算机科学领域的一本经典教材,主要涵盖了计算机硬件、操作系统、编译器、存储...在markdown格式的学习笔记中,这些知识点可能会以清晰的段落、列表和代码示例的形式呈现,便于理解和复习。

    LaTex教程--latex排版学习笔记---入门提高.zip

    《LaTeX教程——LaTeX排版学习笔记——入门提高》是一个专门为初学者设计的资源包,旨在帮助读者快速掌握LaTeX这一强大的文本处理系统。LaTeX是一种基于TeX的文字处理系统,广泛应用于科研、教育和工程领域,尤其在...

    laravel框架学习笔记--阿里云部署

    【laravel框架学习笔记--阿里云部署】 Laravel是一款基于PHP的开源Web应用框架,以其优雅的语法和强大的功能深受开发者喜爱。本笔记主要聚焦在如何将一个Laravel项目部署到阿里云服务器上,以便在互联网上运行。...

    CentOS 6.4 i386的学习笔记-001 自定义安装图形界面

    笔记中使用的是VirtualBox 4.2版本,这是一款免费的虚拟机软件,非常适合在不同的操作系统上测试和运行各种Linux发行版,包括CentOS 6.4。 ##### 安装语言与界面 作者选择的是英文安装界面,但同时也提到了不同...

    学习笔记-深入理解计算机系统-第二章.7z

    9. **操作系统内核**:内核是操作系统的核心,负责资源分配、调度、错误处理和进程间通信等任务。理解内核如何工作对于理解操作系统的工作原理至关重要。 10. **并发与多线程**:现代计算机通常执行多个任务或线程...

    Linux学习笔记--RuanJava

    在Linux学习过程中,了解操作系统的核心结构以及主要目录的用途至关重要。Linux系统采用的是层次化的目录结构,这使得系统管理更为有序。以下是对标题和描述中涉及的一些关键知识点的详细解释: 1. **根目录** `/`...

    5GNR学习笔记-理论v1.0.pdf

    《5GNR学习笔记-理论v1.0》是一份深入探讨5G New Radio (NR) 技术的文档,涵盖了5G网络架构、功能划分、网络接口以及无线协议栈等多个方面。以下是其中的关键知识点: 1. **5G NR总体架构**: - NG-RAN(Next ...

    java学习笔记-基础

    ### Java学习笔记——基础知识详解 #### 一、Java开发环境(JDK)与运行环境(JRE) Java技术的核心在于其强大的跨平台能力,这主要得益于Java的两大环境:JDK(Java Development Kit)和JRE(Java Runtime ...

    写得蛮好的linux学习笔记--linux目录架构

    Linux作为一款广泛使用的开源操作系统,其目录结构设计严谨,层次分明,对系统的稳定运行和资源管理起着至关重要的作用。本文旨在深入解析Linux的目录架构,帮助读者更好地理解每个目录的功能与用途。 #### 根目录...

    《操作系统》学习笔记(思维导图)

    本学习笔记主要基于《王道2020考研操作系统》教材,通过思维导图的形式,对操作系统的主要概念、原理和技术进行了深入浅出的阐述。以下是四个核心领域的详细解释: 1. 进程管理: 进程是程序在执行过程中的一个...

    windows环境MASM32汇编程序设计学习笔记

    《Windows环境下MASM32汇编程序设计学习笔记》是一份深入探讨在Windows操作系统中使用MASM32汇编语言进行程序开发的详实资料。MASM32是Microsoft汇编语言的一个版本,专为Windows平台设计,它提供了一套完整的开发...

    js学习笔记-恶意代码识别

    2. 修改页面元素:利用`document.images`或其他DOM元素,攻击者可以改变页面上的图像、链接等,达到欺骗用户的目的。 3. 修改变量值:在未进行数据验证的情况下,攻击者可以通过JavaScript注入改变变量的值,影响...

    计算机系统-笔记-HUN2021级

    计算机系统是信息技术的基础,主要由硬件...总结起来,这份笔记涵盖了计算机系统的基础知识,包括数据的表示、程序的编译过程、汇编语言、内存管理以及位操作。理解这些概念对于深入学习计算机科学和软件开发至关重要。

    USB学习笔记-Linux中的USB驱动分析.pdf

    Linux中的USB驱动是操作系统与USB设备之间交互的关键部分,它负责管理和处理USB设备的各种操作。在深入理解USB驱动之前,我们需要了解一些基本概念和结构体。以下是对这些内容的详细解释: 1. 结构体: 在Linux内核...

Global site tag (gtag.js) - Google Analytics