程序执行原理揭秘:你的代码是如何“跑”起来的?

news2024/11/16 15:35:35

程序执行原理揭秘:你的代码是如何“跑”起来的?

一、执行前的准备工作

我们先来看一下程序执行前需要做哪些准备工作。

我们首先需要了解程序的格式。你可以把程序比作一本书,而程序的格式就是这本书的版式,它决定了书的结构和排版。就像我们在阅读书籍时,不同的语言(如英语、中文)会有不同的阅读方式和理解方法一样,不同的操作系统(如Linux、Windows)也会有各自的方式去读取和理解程序。这就是程序格式的作用,它帮助操作系统正确地读取和理解程序。

1.1 程序格式

以Linux为例,我们需要使用ELF(Execuatable and Linkable File Format)格式。在这个格式中,依次主要包括了文件头、代码段、数据段、重定向表和符号表等信息。

  • 文件头就是这本书的封面,它包含了文件的属性,对应的CPU、操作系统等信息。
  • 代码段就像是书中的内容,包含了程序的代码和指令。
  • 数据段就像是书中的图表,包含了程序内设置的初始化数据。
  • 重定向表就像是书中的脚注,链接前整理的不确定的跳转地址。
  • 符号表就像是书中的索引,包含了函数和全局变量的名称与地址对照表。

对于其它操作系统,在Windows中,我们使用的是PE(Portable Executable)格式;在Mac中,我们使用的是Mach-O格式。这些格式都包含了程序或库需要的各种信息,以便于操作系统能正确地加载和执行,但是由于适用于不同的操作系统,它们在文件结构、功能特性以及处理方式上有所差异。例如,ELF支持多种不同的地址空间布局,PE支持延迟加载和数据目录,而Mach-O则支持多架构和动态链接。

我们的程序想要在某种操作系统上运行,就必须以对应的格式组织代码才行。

1.2 Build过程

Build过程就是将程序代码按照某种格式进行组织的过程, 其中包括编译、汇编和链接。。

编译就像是把手稿生成汇编代码或中间代码,生成的是目标文件,这就像是我们的初稿。

汇编就像是把我们的初稿生成机器码,也就是二进制的0和1,但这还不是CPU可以直接执行的指令,这就像是我们的定稿。

链接就像是把我们的定稿打印成书,包括静态链接和动态链接。

  • 静态链接是把程序内部不同子程序的代码段合并,以及其中的共享函数。这个过程是把所有目标文件中的符号表集中起来,根据重定位表,把所有不确定的跳转地址修正为符号表中对应的地址,然后合并目标文件中的各个段,形成可执行文件。就像是把书中的各个章节合并在一起。
  • 动态链接就像是一座图书馆,它可以让多本书(多个程序)共享一些常用的资源,如语言和操作系统基础库,这样就可以节省内存空间。在Windows系统中,这种共享资源的方式使用的是dll文件,而在Linux系统中,使用的是so文件。你可以把这些共享资源看作是放在特定位置的一本书,每个功能就像书中的一个章节,都有自己的位置。当你需要用到某个功能时,就像查阅书中的某个章节一样,你会通过一个目录(程序链接表)找到它在全局目录(全局偏移表)中的位置。全局目录在你需要时会被创建,这样你就能根据目录找到你需要的功能,而不必去翻阅整本书。

二、执行中的过程

当我们的书准备好后,我们就可以开始阅读了。这个过程就像是程序的执行过程。

装载器把可执行文件加载到内存,就像是我们打开书本,准备阅读。

CPU从内存读取指令和数据,就像是我们从书中读取文字和图表。

动态链接的过程就像是我们阅读时需要参考其他书籍。

当程序跳转到要执行共享库代码指令时,就去程序链接表查找地址,程序链接表中定义了指令在全局偏移表中的地址。如果共享库未加载到内存则先加载,然后建立当前程序虚拟内存与共享库内存的映射,并登记执行指令虚拟内存地址到全局偏移表。然后跳转到当前程序为共享库映射的虚拟地址,读取指令并执行。


总的来说,程序的执行就像是我们写书和阅读书的过程。我们首先需要准备好我们的手稿,然后通过编译、汇编和链接,把我们的手稿变成一本可以阅读的书。然后,我们就可以开始阅读这本书,从中获取知识和信息。在这个过程中,我们可能还需要参考其他的书籍,这就是动态链接的过程。

希望通过本文,你能更好地理解程序的执行过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1411305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python-PyCharm】PyCharm 安装并创建项目(保姆级教程)

【Python-PyCharm】PyCharm 安装并创建项目(保姆级教程) 1)PyCharm 下载2)PyCharm 安装3)创建项目(使用PyCharm编写程序) 使用 PyCharm 需要配置 Python 环境变量,详情如下&#xff…

使用DBSyncer同步Oracle11g数据到Mysql5.7中_实现全量数据同步和增量数据实时同步_操作过程---数据同步之DBSyncer工作笔记007

之前都是用mysql和Postgresql之间进行同步的,已经实现了数据的实时同步,现在要实现Oracle数据库到Mysql数据库的全量,以及增量同步. 因为之前配置的不对,这里架构名写成了orcl,所以导致,虽然能连接上,但是,在进行数据同步的时候,看不到表,所以这里说一下如何进行连接 这里,首先…

力扣80、删除有序数组中的重复项Ⅱ(中等)

1 题目描述 图1 题目描述 2 题目解读 对于有序数组nums,要求在不使用额外数组空间的条件下,删除数组nums中重复出现的元素,使得nums中出现次数超过两次的元素只出现两次。返回删除后数组的新长度。 3 解法一:双指针 双指针法可以…

分享7种SQL的进阶用法

分享7种SQL的进阶用法 前言 还只会使用SQL进行简单的insert、update、detele吗?本文给大家带来7种SQL的进阶用法,让大家在平常工作中使用SQL简化复杂的代码逻辑。 1.自定义排序(ORDER BY FIELD) 在MySQL中ORDER BY排序除了可以…

HNSW算法

From: HNSW算法(nsmlib/hnswlib)-CSDN博客HNSW算法的基本原理及使用 - 知乎 HNSW是一种广泛使用的ANN图索引结构,包括DiskANN、DF-GAS、SmartSSD等。本文档主要总结HNSW的结构与工作流程,便于后期研究其工作流程在迁移到CSD中存在的I/O问题…

【LeetCode: 148. 排序链表 + 链表 + 归并排序】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

防火墙源NAT配置

拓扑 需求 生产区在工作时间内可以访问服务器区,仅可以访问HTTP服务器。办公区全天可以访问服务区,其中,10.0.2.20可以访问FTP服务器和HTTP服务器 10.0.2.10仅可以ping通10.0.3.10办公区在访问服务区时采用匿名认证方式进行上网行为管理。办…

SAP创建资产号码和分配资产价值

文章目录 1 Creat new asset2 View asset3 Create old asset4 Transfer value5 Summary 1 Creat new asset T-code(AS01) 2 View asset T-CODE : AS03 3 Create old asset T-code(as91) 4 Transfer value T-code(ABLDT) If there is following information a…

双向队列的创建队首与队尾的操作deque()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 双向队列的创建 队首与队尾的操作 deque() [太阳]选择题 请问以下代码输出的结果是? from collections import deque print("【创建双向队列】d deque()") d deque(…

[Python] 机器学习 - 常用数据集(Dataset)之鸢尾花(Iris)数据集介绍,数据可视化和使用案例

鸢(yuān)尾花(Iris)数据集介绍 鸢【音:yuān】尾花(Iris)是单子叶百合目花卉,是一种比较常见的花,而且鸢尾花的品种较多,在某个公园里你可能不经意间就能碰见它。 鸢尾花数据集最初由Edgar Anderson 测量…

LeetCode 热题 100 | 子串

目录 1 560. 和为 K 的子数组 2 239. 滑动窗口最大值 3 76. 最小覆盖子串 菜鸟做题第二周,语言是 C 1 560. 和为 K 的子数组 题眼:“子数组是数组中元素的连续非空序列。” 解决本问题的关键就在于如何翻译问题。子数组 s 的和可以看作数组 i 的…

手撕重采样,考虑C的实现方式

一、参考文章: 重采样、上采样、下采样 - 知乎 (zhihu.com) 先直接给结论,正常重采样过程如下: 1、对于原采样率fs,需要重采样到fs1,一般fs和fs1都是整数哈,则先找fs和fs1的最小公倍数,设为m…

WordPress反垃圾评论插件Akismet有什么用?如何使用Akismet插件?

每次我们成功搭建好WordPress网站后,都可以在后台 >> 插件 >> 已安装的插件,在插件列表中可以看到有一个“Akismet反垃圾邮件:垃圾邮件保护”的插件(个人觉得是翻译错误,应该是反垃圾评论)。具…

【新书推荐】3.4 浮点型

本节必须掌握的知识点: 示例九 代码分析 汇编解析 浮点数的输出精度 【补充内容】 3.4.1 示例九 浮点型分为:单精度float、双精度double、长双精度long double。 类型 存储大小 值范围 精度 单精度 float 4字节 【1.2E-38~ 3.4E38】 6位小数 …

SpringMVC-对静态资源的访问

1.工程中加入静态资源 在webapp下创建static文件夹,此文件夹专门放入静态资源 2.使项目可以处理静态资源的请求 在SpringMVC配置文件中添加以下语句 1.引入命名空间 xmlns:mvc"http://www.springframework.org/schema/mvc" xsi:schemaLocation“http…

HarmonyOS鸿蒙学习笔记(23)监听Wifi状态变化

监听Wifi状态变化 前言创建接收状态变化的Bean对象创建订阅者和订阅事件参考资料: 前言 本篇博文通过动态订阅公共事件来说明怎么使用HarmonyOS监听Wifi状态的变化。关于动态订阅公共事件的概念,官网有详细说明,再次就不在赘述。博文相关项目…

UE5 Chaos系统 学习笔记

记得开插件: 1、锚点场 在锚点场范围内的物体静止且不被其他力场损坏 2、ClusterStrain 破裂效果的力 3、DisableField chaos破裂后的模拟物理在绿色范围内禁止模拟物理 4、ForceAndStrain 破裂效果的力 5、ForceAndStrainFallOff 破裂效果的力,但是…

代码随想录算法训练营第十一天 | 二叉树基础

代码随想录算法训练营第十一天 | 二叉树基础 文章目录 代码随想录算法训练营第十一天 | 二叉树基础1 二叉树的理论基础1.1 二叉树的类型1.2 二叉树的存储方式1.3 二叉树的遍历方式1.4 二叉树的定义 2 二叉树的递归遍历2.1 前序遍历2.2 中序遍历2.3 后序遍历 3 二叉树的迭代遍历…

【QT+QGIS跨平台编译】之十:【libbz2+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、libbz2介绍二、文件下载三、文件分析四、pro文件五、编译实践一、libbz2介绍 bzip2是一个基于Burrows-Wheeler 变换的无损压缩软件,压缩效果比传统的LZ77/LZ78压缩算法来得好。它是一款免费软件。可以自由分发免费使用。 bzip2能够进行高质量的数据压缩。它利用…

SpringBoot-yml文件的配置与读取

配置 值前边必须要有空格,作为分隔符 使用空格作为缩进表示层级关系,相同的层级左侧对齐 获取 使用Value(”${键名}”) 使用ConfigurationProperties(prefix "前缀") 1.前缀要与yml配置文件中的前缀一致 2.实体类的字段名与配置文件中的键名一…