win32程序启动过程

来源:互联网 发布:淘宝关注量最高的店铺 编辑:程序博客网 时间:2024/05/17 00:51

在现代操作系统中,计算机应用程序以文件形式(可执行文件、动态库文件、配置文件和其他文件等)保存在磁盘中。所谓“程序启动过程”,指从用户发出请求执行程序,到该应用程序完全启动(例如程序界面完全显示,准备响应用户的输入)这个过程。从系统分工的角度来看,程序启动过程包括两个阶段:

(1)       操作系统负责把程序从磁盘读入内存并且建立相应得运行环境

(2)       应用程序自身的初始化过程。

编译连接过程:

1、 预编译展开一些宏

2、 为每一个.cxx源文件编译一个目标文件(.obj,.o),目标文件中至少包含二进制的代码段和数据段。在cxx源文件中可能会引用在其他cxx/hxx中定义的符号,也可能是自己定义的一些符号,这些作用域超过一个cxx文件的符号称为“public符号”(例如非静态函数)。因此每一个目标文件中也包含一个符号表,用于记录自己引用的符号及自己提供的public符号

3、 编译器合成这些目标文件成一个库文件(.lib),同时解析可以找到的符号引用。此时这个库文件包含了二进制的代码段和数据段,同样也会包含一个符号表,因为有一些符号需要引用其他静态/动态链接库的导出符号

4、 链接器负责把目标的库文件和所有需要引用的静态/动态链接库进行链接,即需要首先把静态库合成到可执行文件中。转换相应的符号引用为地址,然后确保所引用的其他动态链接库的符号存在。最后生成可执行文件,可执行文件的符号表只需要记录导入符号表。

 

程序启动过程:

1、 操作系统首先创建相应得进程并分配私有的进程空间,然后操作系统得加载器负责把可执行文件的数据段和代码段映射到进程的虚拟内存空间中

2、 加载器读入可执行程序的导入符号表,然后根据这些符号表可以查找出该可执行程序所有依赖的动态链接库

3、 加载器针对该程序依赖的每一个动态链接库调用LoadLibrary

(1)    查找对应得动态库文件,加载器为该动态链接库确定一个合适的基地址。如果该基地址和动态链接库希望加载的基地址不同,加载器还要为该库做rebase,然后把整个动态链接库映射到虚拟内存空间中

(2)    加载器读取该动态链接库的导入符号表和导出符号表,比较应用程序要求的导入符号是否匹配该库的导出符号

(3)    针对该库的导入符号表,查找对应依赖的动态链接库,如果有跳转到第3

(4)    调用该动态链接库的初始化函数

直到所有应用程序直接/间接依赖的动态链接库处理完毕,全部映射到应用程序进程空间,成为应用程序进程的一部分。

4、 初始化应用程序的全局变量,对于全局对象自动调用构造函数

5、 进入应用程序入口点函数开始执行

 

程序启动性能定义为程序启动所需要的时间,在工程实践中,程序启动性能有两个指标需要分别对待,即冷启动性能和热启动性能。冷启动性能指操作系统重新启动后,应用程序第一次启动所需要的时间;热启动性能则指应用程序第2次及其以后启动所需要的时间。之所以要区分这两个指标,是因为操作系统的缓存机制在发挥作用。程序第1次启动完毕并且推出程序后,操作系统仍然会在内存的硬盘缓存和系统缓存中暂时保留可执行程序、相应的动态链接库,以及程序用到的其他配置文件/资源文件的内容。从而在应用程序的第2次启动时,可以减少大量的I/O操作,导致热启动性能要好于冷启动性能。

原创粉丝点击