一个Microsoft的_exe程序的启动过程.doc

上传人:sk****8 文档编号:3150715 上传时间:2019-05-23 格式:DOC 页数:21 大小:712.50KB
下载 相关 举报
一个Microsoft的_exe程序的启动过程.doc_第1页
第1页 / 共21页
一个Microsoft的_exe程序的启动过程.doc_第2页
第2页 / 共21页
一个Microsoft的_exe程序的启动过程.doc_第3页
第3页 / 共21页
一个Microsoft的_exe程序的启动过程.doc_第4页
第4页 / 共21页
一个Microsoft的_exe程序的启动过程.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

1、一个 microsoft 的.exe 程序的启动过程 学习 windows 编程从 mfc 角度来说可分为两部分那就是 WinMain 函数以前的,和 WinMain 函 数以后的。前者涉及很多 windows 操作系统内部的知识,后者么看 mfc 源码就可以了。虽然大 多数程序不需要你了解太多关于 os 加载应用程序这方面的知识,但我认为能较深入了解windows os 的运行情况对程序员是很有帮助的。 最近我正在研究一个 microsoft 的.exe 程序的启动过程,这也是以上所说的关于 os 如何加 载程序的知识,它包括进程创建,主线程创建,PE 文件加载,程序 c 运行时启动函数以及

2、四种 main 函数的调用等许多令我不得不静下心来好好思索的东东。从 mfc 编程角度来说,这些都是 不得见的,不过了解这些对程序员编制好的 windows 程序是有好处的。在平时的学习中我有 很多疑点,到底在桌面双击一个 exe 程序,os 调用的第一个函数是什么?甚至到现在我研究很 长时间后,还是得不到令我满意的答案。不过在学习的过程中我还是有收获的,下面和大 家一起分享一下,我也把这段时间所学作一下总结。 要了解一个.exe 程序的启动过程就不得不了解一下有关操作系统方面的知识,such as“ 进程,线程,虚拟内存 “的基本的知识。当然这里我就不详细介绍了,有兴趣的同学可以自己 去查一

3、查这方面的资料。在未真正开始之前,先统一一下本文出现的一些名词的含义: App.exe-假定为应用 mfc 的 AppWizard 做出的一个 SDI 程序,App 是它的名字。你 可以把它看为一个标准的 “hello mfc! “程序。 PE-不要以为它是“体育课”的缩写呦。它可是微软的标准 win32 可执行文件 .exe 和动态链接库.dll 的文件格式,它的 English name 是 Portable Executable File Format。 下面可要正式开始了。 一个 microsoft 的.exe 程序的启动方法有很多,这里我们以双击 App.exe 图标启动为例( 其他

4、方法,我想也是一样的)。在补充一下,我所用的 os 是 Windows2000Server,所以这里也 主要讨论 win2000 下的应用程序,过要涉及较多关于 NT 内核,毕竟微软主推 win2000/winxp 和 Unicode 么。 一个 microsoft 的.exe 程序的启动过程如下: (1)当我们双击 App.exe 图标启动程序时,系统首先做什么呢,让我们先听一听侯捷是如何 说的吧“执行起来的 App 进程其实是 shell 调用 CreateProcess 激活的”- “深入浅出 MFC se cond edition “ page39 载。很多书上都是如是说的,shell

5、 又名“命令解释器”,是 win32 操 作系统基于浏览器的一个 32 位用户接口,它是一个多线程的好例子,屏幕上每一个文件夹浏 览窗口都是它的一个线程。它是操作系统引导时加载的系统进程,它具体表现为windows explorer.exe。explorer.exe 是所有用户应用程序的创造者。你完全可以将 shell 看成是所有应 用程序进程的父进程,就像桌面(desktop)可看成所有窗口的父窗口一样。shell 的用途很多 ,如启动应用程序,管理文件系统,将应用程序与相应文件相关联等等。我们常见的桌面上 的带有小箭头的快捷方式(shortcut)就是一个 shell 链接,shell 负

6、责管理一个叫 “名字空间 “ 的类似文件系统似的“超文件系统”,它允许应用程序在任何地方在不知访问对象名字和位置 的前提下访问到这个对象,此类对象有:文件,目录,驱动器,打印机以及网络资源。而名 字空间就是 shell 把这些对象有层次组织起来的一个结构。名字空间为用户和应用程序提供了 一种可靠和高效的方法来访问和管理对象。好了不论它是什么,反正它调用了 CreateProcess,一切就从这里开始了。 (2)CreateProcess 这个函数可作了不少工作。App 进程由此诞生。当 CreateProcess 这个函 数被调用,系统就会创建一个“进程内核对象”。进程内核对象可以看作一个操作

7、系统用来 管理进程的内核对象,它也是系统用来存放关于进程统计信息的地方(一个小的数据结构) ,其实它的真正创建者是一个叫 NtCreateProcess 的 windows2000 系统服务函数(也叫执行体服 务函数),他创建了进程内核对象供用户扩展。进程内核对象的初始使用计数为 1。然后系统 为该进程创建 4GB(=232)的虚拟地址空间(所谓虚拟就不是真的创建 4GB 的物理内存空间,这 些空间不是真在物理内存上).用于加载 App.exe 可执行文件和任何必要的 dll 文件的数据和代码。 (3)下面概述一下系统的加载器(可称为 loader)是如何加载这些东东的。首先了解一下系 统为该

8、进程创建 4GB 的虚拟地址空间是如何分配的,对于 win2000/winxp 来说,默认情况下每 个用户进程可以占有 2GB 的私有地址空间;操作系统占有剩余的 2GB 空间。 在 32 位 x86 系统上, 从 0x00000000 到 0x7fffffff 的空间中存放着 应用程序代码,全局变量,每个线程堆栈,dll 代码。 从 0x80000000 到 0xc0000000 的空间中存放着 内核和执行体,HAL(硬件抽象层),引导驱动程序 从 0xc0000000 到 0xc0800000 的空间中存放着 进程页表和超空间。 从 0xc0800000 到 0xffffffff 的空间中

9、存放着 系统高速缓存,分页缓冲池,非分页缓冲池。 首先,CreateProcess 打开应用程序文件(.exe),它先扫描该文件的文件头,该文件头里含有文 件能运行在那个环境之下,如果是 win32 环境,系统就直接加载文件的代码和数据并输入(im port)该文件执行所需的 dll 函数。如果不是 win32 环境比如时 os/2 的.exe 则先加载相应的环境 子系统,再由该环境加载该文件的代码和数据以及该文件执行所需的 dll 函数。至于系统是如 何知道文件的代码和数据以及该文件执行所需的 dll 函数所在的位置就需要你了解一下 PE 文件 格式了,其实也很简单,PE 文件拥有很多 se

10、ctions,数据和代码都放在不同的 section 里面, 文件执行所需的 dll 也放在单独的 section(.idata)里,这里就不详述了。而且在加载过程中涉 及到有关虚拟内存,内存映射文件等很多较深的知识,我会在以后的系列文章中详细专题论 述的。 (4)进程加载代码和数据完毕后,就开始创建线程来执行进程空间内的代码。进程是静态的 ,它只是线程的容器。一个进程至少应该有一个线程(main thread),其它线程都是主线程通 过调用 CreateThread 函数创建的。线程也是核心对象,他的实际创建者是一个叫 NtCreateTh read 的 windows2000 系统服务函数

11、。一个线程其实只是一个线程核心对象和两个堆栈(一个核 心堆栈,用于线程运行在核心态;一个用户堆栈,用于线程运行在用户态),线程与进程类似 ,也拥有线程核心对象计数和线程句柄,这里不详述。线程用于描述进程中的运行路径。每 当进程被初始化时,系统就要创建一个主线程。该线程与 c/c+运行时库的启动代码一道开始 运行,启动代码则调用进入点函数(就是我们的 main 函数,它也是主线程的进入点函数),并 且继续运行直到进入点函数返回并且 c/c+运行时库的启动代码调用 ExitProcess 为止。每个 线程都有自己的入口点函数,主线程入口点函数名字必须是 main,wmain,WinMain 或 w

12、WinMain .而其他的线程入口点函数名字可使用任何名字。每个线程函数必须有一个返回值,它将作为 线程的退出代码。对于主线程来说,这个返回值将传给 c/c+运行时库的启动函数。 (5)c/c+运行时库的启动函数它其实是一个程序的真正调用的第一个函数,它是在程序链 接时由链接程序选择相应的启动函数并加到程序的开始处。c/c+运行时库有四个版本的启动 函数,他们分别对应不同类型的应用程序。比如,需要 ANSI 字符和字符串的 GUI 应用程序的启 动函数是 WinMainCRTStartup,其对应的进入点函数是 WinMain,需要 Unicode 字符和字符串的 GUI 应用程序的启动函数是

13、 wWinMainCRTStartup,其对应 的进入点函数是 wWinMain,而需要 ANSI 字符和字符串的 CUI 应用程序(如控制台 console 程序)的应用程序的启动 函数是 mainCRTStartup,对应的入口点函数为 main;需要 Unicode 字符和字符串的 CUI 应用程序 (如控制台 console 程序)的应用程序的启动函数为 wmainCRTStartup,对应的入口点函数为 wma in;c/c+运行时库的启动函数的功能如下: 以 wWinMainCRTStartup(大多数运行在 windows2000 下的应用程序的启动函数都是它)为例。它 负责:

14、*检索指向新进程的完整命令行指针; *检索指向新进程的环境变量的指针; *对 c/c+运行时的全局变量进行初始化; *对 c 运行期的内存单元分配函数(比如 malloc,calloc)和其他低层 I/O 例程使用的内存栈进 行初始化。 *为 C+的全局和静态类调用构造函数。 当这些初始化工作完成后,该启动函数就调用 wWinMain 函数进入应用程序的执行。 当 wWinMain 函数执行完毕返回时,wWinMainCRTStartup 启动函数就调用 c 运行期的 exit()函 数,将返回值 (nMainRetVal)传递给它。之后 exit()便开始收尾工作: *调用由_onexit(

15、)函数调用和注册的任何函数。 *为 C+的全局和静态类调用析构函数; *调用操作系统的 ExitProcess 函数,将 nMainRetVal 传递给它,这使得操作系统能够撤销进 程并设置它的 exit 代码。 (6)至此启动函数的任务完成,至于中间 wWinMain 函数的运行过程看看 mfc 源码即可。不过我还要提一下,wWinMain 函数其实只是调用了 mfc 的 AfxWinMain()函数,而一切的真正代码的运 行也是从 AfxWinMain()开始的。 以上只是粗略将一下一个 microsoft 的.exe 程序的启动过程,其中有很多深奥的知识我只是提了一下,有些知识在以后的文

16、章中还会陆续提到的。 bigwhite 2002.5.18 对我有用0 丢个板砖0 引用 举报 管理 TOP 回复次数:47 #1 楼 得分:0 回复于:2007-09-04 12:39:22好文,收藏 bucherren 等 级: 对我有用0 丢个板砖0 引用 举报 管理 TOP #2 楼 得分:0 回复于:2007-09-04 13:20:08mark T97102003 (池塘里的水手) 等 级: 对我有用0 丢个板砖0 引用 举报 管理 TOP #3 楼 得分:0 回复于:2007-09-04 13:32:22mark ouyh12345 (五岭散人) 等 级: 2 对我有用0 丢个板

17、砖0 引用 举报 管理 TOP #4 楼 得分:0 回复于:2007-09-04 14:12:26已阅,好文 zhoujiamurong (有分俺就不要,俺要知识) 等 级: 对我有用0 丢个板砖0 引用 举报 管理 TOP #5 楼 得分:0 回复于:2007-09-06 11:15:57mark xjtuzhw (飞影) 等 级: 对我有用0 丢个板砖0 引用 举报 管理 TOP #6 楼 得分:0 回复于:2007-09-07 00:13:34mark GGYYBOY (编程浪子 ) 等 级: 对我有用0 丢个板砖0 引用 举报 管理 TOP #7 楼 得分:0 回复于:2007-09-

18、10 13:45:06mark syy64 (太平洋) 等 级: 3 对我有用0 丢个板砖0 引用 举报 管理 TOP #8 楼 得分:0 回复于:2007-09-10 16:51:56收藏 andy888666 (andy) 等 级: 对我有用0 丢个板砖0 引用 举报 管理 TOP #9 楼 得分:0 回复于:2007-09-10 16:58:49顶啊 不错! 清晰明了 bill68551632 等 级: 对我有用0 丢个板砖0 引用 举报 管理 TOP #10 楼 得分:0 回复于:2007-09-11 10:05:04mark zhaomishun (mark) 等 级: 对我有用0

19、丢个板砖0 引用 举报 管理 TOP #11 楼 得分:0 回复于:2007-09-11 18:29:28mark clearma (明天早起床) 等 级: 对我有用0 丢个板砖0 引用 举报 管理 TOP #12 楼 得分:0 回复于:2007-09-11 19:35:21mark hjcy_2002 (hjcy) 等 级: 对我有用0 丢个板砖0 引用 举报 管理 TOP Scarroot #13 楼 得分:0 回复于:2007-09-12 09:51:54mark (每天一贴,把分用完.) 等 级: 对我有用0 丢个板砖0 引用 举报 管理 TOP #14 楼 得分:0 回复于:2007

20、-09-12 17:06:09mark Treazy (戒指) 等 级: 对我有用0 丢个板砖0 引用 举报 管理 TOP #15 楼 得分:0 回复于:2007-09-12 18:20:37收藏 dreamcs (冰河) 等 级: 对我有用0 丢个板砖0 引用 举报 管理 TOP #16 楼 得分:0 回复于:2007-09-12 21:57:14写的好乱,条理再清晰点就好了.想知道 C runtime 是怎么回事 kaien_kira 等 级: 对我有用0 丢个板砖0 引用 举报 管理 TOP #17 楼 得分:0 回复于:2007-09-12 22:30:44mark hediant (何) 等 级: 对我有用0 丢个板砖0 引用 举报 管理 TOP #18 楼 得分:0 回复于:2007-09-13 01:13:33mark yesir1006 (晔子) 等 级: 对我有用0 丢个板砖0

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 重点行业资料库 > 建筑建材

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。