Windows知识:一个exe程序是怎样被启动跑起来的

计算机上运行的程序看似复杂难懂,但背后却遵循着一套规范化的流程。理解这一流程,不仅有助于开发者优化代码性能,还能帮助我们更好地进行故障排查。本篇文章将详细剖析一个程序在Windows操作系统上从静态代码到动态运行的全过程。


🧑 博主简介:现任阿里巴巴嵌入式技术专家,15年工作经验,深耕嵌入式+人工智能领域,精通嵌入式领域开发、技术管理、简历招聘面试。CSDN优质创作者,提供产品测评、学习辅导、简历面试辅导、毕设辅导、项目开发、C/C++/Java/Python/Linux/AI等方面的服务,如有需要请站内私信或者联系任意文章底部的的VX名片(ID:gylzbk

💬 博主粉丝群介绍:① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。③ 群内也有职场精英,大厂大佬,可交流技术、面试、找工作的经验。④ 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬。⑤ 进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。

在这里插入图片描述

在这里插入图片描述

程序加载概述

一般来说,程序从开始加载到启动运行,主要包括以下几步:

  1. 程序启动:从磁盘加载到内存;
  2. 链接:解析外部依赖;
  3. 初始化:加载并初始化静态和全局数据;
  4. 执行代码:进入主程序入口点,如main函数。

接下来,我们将逐步详解每一步。

1. 程序启动

当你在Windows上双击一个可执行文件(如.exe文件)时,操作系统首先要做的工作是将这个文件从硬盘读入内存。

Windows的启动机制

Windows使用的是可执行与链接格式(PE格式),加载器会检查和验证可执行文件的头部信息,确保文件是有效且完整的。

假设文件是合法的,Windows创建一个新的进程,该进程拥有独立的虚拟地址空间。加载器将文件的代码、数据段以及其他必要的数据块映射到这个虚拟地址空间中。

2. 链接

通过加载器的映射,静态代码和数据会被加载到内存中,但此时程序通常依赖于一些外部库,如动态链接库(DLL)。

动态链接

加载器会解析可执行文件中的导入表,根据其中的符号定位对应的DLL文件。如果某个DLL文件尚未加载,加载器将再递归加载这些DLL。

动态链接过程

  1. 解析导入表:找到程序所需的所有符号,如函数和变量。
  2. 加载DLL:如果对应的DLL未在内存中,则将其加载进内存。
  3. 修正地址:将程序中对这些符号的引用替换为实际内存地址,以确保程序能够正确调用外部函数或访问外部变量。

3. 初始化

在程序入口点(如main函数)执行前,加载器还需进行一些初始化工作。这些包括但不限于:

静态和全局变量初始化

  1. 值初始化:程序中声明的静态和全局变量需要初始化。加载器负责将这些变量设定为编译时指定的初始值。
  2. 构造函数调用:如果使用C++,在main函数执行前,所有全局和静态对象的构造函数会被调用。

执行CRT(C运行时库)初始化

CRT是一个重要的组成部分,它负责在程序正式启动前所需的多种初始化工作,包括:

  1. 初始化堆栈
  2. 初始化线程本地存储(TLS)
  3. 设定文件描述符

这些初始化操作确保了程序在执行用户编写的代码之前,其运行环境已经准备好。

4. 执行代码

所有的初始化工作完成后,加载器将控制权交给程序的入口点,通常是main函数。此时,程序开始执行用户定义的逻辑。

主程序流程

从进入main函数到程序结束,主要依赖于开发者的代码逻辑,通常包括:

  1. 输入处理:从用户获取输入或读取配置文件。
  2. 逻辑处理:根据业务需求执行特定的操作,如数据处理、算法计算等。
  3. 输出结果:将处理结果显示给用户或写入文件。

正常退出与资源回收

程序在执行完所有任务后,需要退出并释放所有占用的资源。可以通过调用exitreturn语句(在main函数中)终止程序,操作系统将执行如下操作:

  1. 调用全局和静态对象的析构函数:如果程序使用C++。
  2. 释放内存:操作系统会回收程序使用的所有内存资源。
  3. 关闭文件和句柄:关闭程序打开的所有文件和资源句柄。

结论

理解程序在Windows操作系统上的运行机制,不仅可以帮助开发者更高效地编写和优化代码,还可以在遇到问题时更快速地进行诊断和定位。通过详细了解从程序启动到正常退出的全部流程,可以更好地掌控程序的整体运行状态,从而提高开发质量与效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

I'mAlex

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值