已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一个microsoft的.exe程序的启动过程 学习windows 编程从mfc角度来说可分为两部分那就是WinMain函数以前的,和WinMain函 数以后的。前者涉及很多windows操作系统内部的知识,后者么看mfc源码就可以了。虽然大 多数程序不需要你了解太多关于os加载应用程序这方面的知识,但我认为能较深入了解windows os的运行情况对程序员是很有帮助的。 最近我正在研究一个microsoft的.exe程序的启动过程,这也是以上所说的关于os如何加 载程序的知识,它包括进程创建,主线程创建,PE文件加载,程序c运行时启动函数以及四种 main函数的调用等许多令我不得不静下心来好好思索的东东。从mfc编程角度来说,这些都是 不得见的,不过了解这些对程序员编制好的windows程序是有好处的。在平时的学习中我有 很多疑点,到底在桌面双击一个exe程序,os调用的第一个函数是什么?甚至到现在我研究很 长时间后,还是得不到令我满意的答案。不过在学习的过程中我还是有收获的,下面和大 家一起分享一下,我也把这段时间所学作一下总结。 要了解一个.exe程序的启动过程就不得不了解一下有关操作系统方面的知识,such as“ 进程,线程,虚拟内存 的基本的知识。当然这里我就不详细介绍了,有兴趣的同学可以自己 去查一查这方面的资料。在未真正开始之前,先统一一下本文出现的一些名词的含义: App.exe-假定为应用mfc的AppWizard做出的一个SDI程序,App是它的名字。你 可以把它看为一个标准的 hello mfc! 程序。 PE-不要以为它是“体育课”的缩写呦。它可是微软的标准win32可执行文件 .exe和动态链接库.dll的文件格式,它的English name是Portable Executable File Format。 下面可要正式开始了。 一个microsoft的.exe程序的启动方法有很多,这里我们以双击App.exe图标启动为例( 其他方法,我想也是一样的)。在补充一下,我所用的os是Windows2000Server,所以这里也 主要讨论win2000下的应用程序,过要涉及较多关于NT内核,毕竟微软主推win2000/winxp和 Unicode么。 一个microsoft的.exe程序的启动过程如下: (1)当我们双击App.exe图标启动程序时,系统首先做什么呢,让我们先听一听侯捷是如何 说的吧“执行起来的App进程其实是shell调用CreateProcess激活的”- 深入浅出MFC se cond edition page39载。很多书上都是如是说的,shell又名“命令解释器”,是win32操 作系统基于浏览器的一个32位用户接口,它是一个多线程的好例子,屏幕上每一个文件夹浏 览窗口都是它的一个线程。它是操作系统引导时加载的系统进程,它具体表现为windows explorer.exe。explorer.exe是所有用户应用程序的创造者。你完全可以将shell看成是所有应 用程序进程的父进程,就像桌面(desktop)可看成所有窗口的父窗口一样。shell的用途很多 ,如启动应用程序,管理文件系统,将应用程序与相应文件相关联等等。我们常见的桌面上 的带有小箭头的快捷方式(shortcut)就是一个shell链接,shell负责管理一个叫 名字空间 的类似文件系统似的“超文件系统”,它允许应用程序在任何地方在不知访问对象名字和位置 的前提下访问到这个对象,此类对象有:文件,目录,驱动器,打印机以及网络资源。而名 字空间就是shell把这些对象有层次组织起来的一个结构。名字空间为用户和应用程序提供了 一种可靠和高效的方法来访问和管理对象。好了不论它是什么,反正它调用了CreateProcess,一切就从这里开始了。 (2)CreateProcess这个函数可作了不少工作。App进程由此诞生。当CreateProcess这个函 数被调用,系统就会创建一个“进程内核对象”。进程内核对象可以看作一个操作系统用来 管理进程的内核对象,它也是系统用来存放关于进程统计信息的地方(一个小的数据结构) ,其实它的真正创建者是一个叫NtCreateProcess的windows2000系统服务函数(也叫执行体服 务函数),他创建了进程内核对象供用户扩展。进程内核对象的初始使用计数为1。然后系统 为该进程创建4GB(=232)的虚拟地址空间(所谓虚拟就不是真的创建4GB的物理内存空间,这 些空间不是真在物理内存上).用于加载App.exe可执行文件和任何必要的dll文件的数据和代码。 (3)下面概述一下系统的加载器(可称为loader)是如何加载这些东东的。首先了解一下系 统为该进程创建4GB的虚拟地址空间是如何分配的,对于win2000/winxp来说,默认情况下每 个用户进程可以占有2GB的私有地址空间;操作系统占有剩余的2GB空间。 在32位x86系统上, 从0x00000000到0x7fffffff的空间中存放着 应用程序代码,全局变量,每个线程堆栈,dll 代码。 从0x80000000到0xc0000000的空间中存放着 内核和执行体,HAL(硬件抽象层),引导驱动程序 从0xc0000000到0xc0800000的空间中存放着 进程页表和超空间。 从0xc0800000到0xffffffff的空间中存放着 系统高速缓存,分页缓冲池,非分页缓冲池。 首先,CreateProcess打开应用程序文件(.exe),它先扫描该文件的文件头,该文件头里含有文 件能运行在那个环境之下,如果是win32环境,系统就直接加载文件的代码和数据并输入(im port)该文件执行所需的dll函数。如果不是win32环境比如时os/2的.exe则先加载相应的环境 子系统,再由该环境加载该文件的代码和数据以及该文件执行所需的dll函数。至于系统是如 何知道文件的代码和数据以及该文件执行所需的dll函数所在的位置就需要你了解一下PE文件 格式了,其实也很简单,PE文件拥有很多sections,数据和代码都放在不同的section里面, 文件执行所需的dll也放在单独的section(.idata)里,这里就不详述了。而且在加载过程中涉 及到有关虚拟内存,内存映射文件等很多较深的知识,我会在以后的系列文章中详细专题论 述的。 (4)进程加载代码和数据完毕后,就开始创建线程来执行进程空间内的代码。进程是静态的 ,它只是线程的容器。一个进程至少应该有一个线程(main thread),其它线程都是主线程通 过调用CreateThread函数创建的。线程也是核心对象,他的实际创建者是一个叫NtCreateTh read的windows2000系统服务函数。一个线程其实只是一个线程核心对象和两个堆栈(一个核 心堆栈,用于线程运行在核心态;一个用户堆栈,用于线程运行在用户态),线程与进程类似 ,也拥有线程核心对象计数和线程句柄,这里不详述。线程用于描述进程中的运行路径。每 当进程被初始化时,系统就要创建一个主线程。该线程与c/c+运行时库的启动代码一道开始 运行,启动代码则调用进入点函数(就是我们的main函数,它也是主线程的进入点函数),并 且继续运行直到进入点函数返回并且c/c+运行时库的启动代码调用ExitProcess为止。每个 线程都有自己的入口点函数,主线程入口点函数名字必须是main,wmain,WinMain或wWinMain .而其他的线程入口点函数名字可使用任何名字。每个线程函数必须有一个返回值,它将作为 线程的退出代码。对于主线程来说,这个返回值将传给c/c+运行时库的启动函数。 (5)c/c+运行时库的启动函数它其实是一个程序的真正调用的第一个函数,它是在程序链 接时由链接程序选择相应的启动函数并加到程序的开始处。c/c+运行时库有四个版本的启动 函数,他们分别对应不同类型的应用程序。比如,需要ANSI字符和字符串的GUI应用程序的启 动函数是WinMainCRTStartup,其对应的进入点函数是 WinMain,需要Unicode字符和字符串的GUI应用程序的启动函数是wWinMainCRTStartup,其对应 的进入点函数是 wWinMain,而需要ANSI字符和字符串的CUI应用程序(如控制台console程序)的应用程序的启动 函数是mainCRTStartup,对应的入口点函数为main;需要Unicode字符和字符串的CUI应用程序 (如控制台console程序)的应用程序的启动函数为wmainCRTStartup,对应的入口点函数为wma in;c/c+运行时库的启动函数的功能如下: 以wWinMainCRTStartup(大多数运行在windows2000下的应用程序的启动函数都是它)为例。它 负责: *检索指向新进程的完整命令行指针; *检索指向新进程的环境变量的指针; *对c/c+运行时的全局变量进行初始化; *对c运行期的内存单元分配函数(比如malloc,calloc)和其他低层I/O例程使用的内存栈进 行初始化。 *为C+的全局和静态类调用构造函数。 当这些初始化工作完成后,该启动函数就调用wWinMain函数进入应用程序的执行。 当wWinMain函数执行完毕返回时,wWinMainCRTStartup启动函数就调用c运行期的exit()函 数,将返回值 (nMainRetVal)传递给它。之后exit()便开始收尾工作: *调用由_onexit()函数调用和注册的任何函数。 *为C+的全局和静态类调用析构函数; *调用操作系统的ExitProcess函数,将nMainRetVal传递给它,这使得操作系统能够撤销进 程并设置它的exit代码。 (6)至此启动函数的任务完成,至于中间wWinMain函数的运行过程看看mfc源码即可。不过我还要提一下,wWinMain函数其实只是调用了mfc的AfxWinMain()函数,而一切的真正代码的运 行也是从AfxWinMain()开始的。 以上只是粗略将一下一个microsoft的.exe程序的启动过程,其中有很多深奥的知识我只是提了一下,有些知识在以后的文章中还会陆续提到的。 bigwhite 2002.5.18 对我有用0 丢个板砖0 引用 举报 管理 TOP 回复次数:47 bucherren 等级: #1楼 得分:0回复于:2007-09-04 12:39:22好文,收藏 对我有用0 丢个板砖0 引用 举报 管理 TOP T97102003 (池塘里的水手) 等级: #2楼 得分:0回复于:2007-09-04 13:20:08mark 对我有用0 丢个板砖0 引用 举报 管理 TOP ouyh12345 (五岭散人) 等级: 2#3楼 得分:0回复于:2007-09-04 13:32:22mark 对我有用0 丢个板砖0 引用 举报 管理 TOP zhoujiamurong (有分俺就不要,俺要知识) 等级: #4楼 得分:0回复于:2007-09-04 14:12:26已阅,好文 对我有用0 丢个板砖0 引用 举报 管理 TOP xjtuzhw (飞影) 等级: #5楼 得分:0回复于:2007-09-06 11:15:57mark 对我有用0 丢个板砖0 引用 举报 管理 TOP GGYYBOY (编程浪子 ) 等级: #6楼 得分:0回复于:2007-09-07 00:13:34mark 对我有用0 丢个板砖0 引用 举报 管理 TOP syy64 (太平洋) 等级: 3#7楼 得分:0回复于:2007-09-10 13:45:06mark 对我有用0 丢个板砖0 引用 举报 管理 TOP andy888666 (andy) 等级: #8楼 得分:0回复于:2007-09-10 16:51:56收藏 对我有用0 丢个板砖0 引用 举报 管理 TOP bill68551632 等级: #9楼 得分:0回复于:2007-09-10 16:58:49顶啊 不错! 清晰明了 对我有用0 丢个板砖0 引用 举报 管理 TOP zhaomishun (mark) 等级: #10楼 得分:0回复于:2007-09-11 10:05:04mark 对我有用0 丢个板砖0 引用 举报 管理 TOP clearma (明天早起床) 等级: #11楼 得分:0回复于:2007-09-11 18:29:28mark 对我有用0 丢个板砖0 引用 举报 管理 TOP hjcy_2002 (hjcy) 等级: #12楼 得分:0回复于:2007-09-11 19:35:21mark 对我有用0 丢个板砖0 引用 举报 管理 TOP Scarroot (每天一贴,把分用完.) 等级: #13楼 得分:0回复于:2007-09-12 09:51:54mark 对我有用0 丢个板砖0 引用 举报 管理 TOP Treazy (戒指) 等级: #14楼 得分:0回复于:2007-09-12 17:06:09mark 对我有用0 丢个板砖0 引用 举报 管理 TOP dreamcs (冰河) 等级: #15楼 得分:0回复于:2007-09-12 18:20:37收藏 对我有用0 丢个板砖0 引用 举报 管理 TOP kaien_kira 等级: #16楼 得分:0回复于:2007-09-12 21:57:14写的好乱,条理再清晰点就好了.想知道C runtime是怎么回事 对我有用0 丢个板砖0 引用 举报 管理 TOP hediant (何) 等级: #17楼 得分:0回复于:2007-09-12 22:30:44mark 对我有用0 丢个板砖0 引用 举报 管理 TOP yesir1006 (晔子) 等级: #18楼 得分:0回复于:2007-09-13 01:13:33mark 对我有用0 丢个板砖0 引用 举报 管理 TOP sining520 (sining520) 等级: #19楼 得分:0回复于:2007-09-13 10:02:11运行时库启动函数和入口点函数到底什么关系啊 谁调用谁 对我有用0 丢个板砖0 引用 举报 管理 TOP wltg2001 (红猪) 等级: #20楼 得分:0回复于:2007-09-13 10:12:06运行时库启动函数和入口点函数到底什么关系啊 谁调用谁 = 启动函数调用入口点函数,你甚至可以去掉入口点函数而自己写启动函数. 对我有用0 丢个板砖0 引用 举报 管理 TOP yxjwang (yxj_wang) 等级: #21楼 得分:0回复于:2007-09-13 12:54:22关注后面的文章 对我有用0 丢个板砖0 引用 举报 管理 TOP lin_style (JAVA卧底、二分流掌门人) 等级: #22楼 得分:0回复于:2007-09-13 14:21:40好象是深入浅出MFC里面的啊 对我有用0 丢个板砖0 引用 举报 管理 TOP expter (cppblog/expter) 等级: #23楼 得分:0回复于:2007-09-13 17:34:28mark 对我有用0 丢个板砖0 引用 举报 管理 TOP ERR0RC0DE 等级: #24楼 得分:0回复于:2007-09-14 21:26:19mark 对我有用0 丢个板砖0 引用 举报 管理 TOP yydrewdrew (满堂花醉三千客,一剑霜寒十四州) 等级: #25楼 得分:0回复于:2007-09-15 17:26:29mark 对我有用0 丢个板砖0 引用 举报 管理 TOP learn100 (learn100) 等级: #26楼 得分:0回复于:2007-09-17 21:28:48最后那个2002.5.18这个时间让我晕倒。 对我有用0 丢个板砖0 引用 举报 管理 TOP liuxiuk (Only_liuxiuk) 等级: #27楼 得分:0回复于:2007-09-17 21:40:35这样的文章强烈支持多发. 对我有用0 丢个板砖0 引用 举报 管理 TOP flysky_zhou (C+继承) 等级: #28楼 得分:0回复于:2007-09-18 11:28:572002年. 汗 支持下 对我有用0 丢个板砖0 引用 举报 管理 TOP wangxs_1984 (月) 等级: #29楼 得分:0回复于:2007-09-18 13:53:35mark 对我有用0 丢个板砖0 引用 举报 管理 TOP loves123 等级: #30楼 得分:0回复于:2007-09-18 14:23:57mark 对我有用0 丢个板砖0 引用 举报 管理 TOP xuelong_zl (点雨点我身上咋就没MM的香水) 等级: #31楼 得分:0回复于:2007-09-19 01:10:52哎,人家作者02年就会这么多了.,差距呀 对我有用0 丢个板砖0 引用 举报 管理 TOP jerry4711 (芋泥,tasty!) 等级: #32楼 得分:0回复于:2007-09-19 16:40:37好文章,标注一下! 对我有用0 丢个板砖0 引用 举报 管理 TOP zhaoyg1986 (菜鸟ing) 等级: #33楼 得分:0回复于:2008-04-05 11:24:50mark 对我有用0 丢个板砖0 引用 举报 管理 TOP rageliu (天气好了就去长白山看水怪) 等级: #34楼 得分:0回复于:2008-04-05 12:11:09up,pe格式的加载 对我有用0 丢个板砖0 引用 举报 管理 TOP Aeolia_Tao (Aeolia) 等级: #35楼 得分:0回复于:2008-04-05 12:26:54mark 对我有用0 丢个板砖0 引用 举报 管理 TOP joyjjjz (Robin) 等级: #36楼 得分:0回复于:2008-08-22 13:39:39d 对我有用0 丢个板砖0 引用 举报 管理 TOP jjl123jjl456 (散人) 等级: #37楼 得分:0回复于:2008-08-23 07:30
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 冰箱的租赁合同范文
- 参建住宅协议书的编写范本
- 交通银行借款合同范本
- 房屋租赁合同终止声明书
- 物业公司管理协议书
- 旅游合作开发合同范文点评
- 建筑劳务分包合同格式范本
- 广东省茶叶原料采购合同模板
- 工程劳动力和施工合同示例
- 员工劳动合同续签互用协议
- 正余弦定理知识点权威总结18页
- 国企纪检监察嵌入式监督的探索与实践
- 浅议小升初数学教学衔接
- 设备安装应急救援预案
- 深基坑工程降水技术及现阶段发展
- 暂堵压裂技术服务方案
- 《孔乙己》公开课一等奖PPT优秀课件
- 美的中央空调故障代码H系列家庭中央空调(第一部分多联机)
- 业主委员会成立流程图
- (完整版)全usedtodo,beusedtodoing,beusedtodo辨析练习(带答案)
- 广联达办公大厦工程施工组织设计
评论
0/150
提交评论