Win9X启动全揭秘(下) 

五、COMMAND.COM 



  COMMAND.COM是WINDOWS 9X中的DOS外壳程序(SHELL),较DOS 6.22仅增加了部分内部命令,没有更新的东西。 



  IO.SYS对COMMAND.COM的处理则有了根本改变,当WIN 9X在CONFIG.SYS中加载EMM386.EXE驱动提供UMB时,COMMAND.COM的常驻部分装入HMA,暂驻部分装入UMB中(在DOS6.22中,COMMAND.COM只能将常驻部分装入HMA),这将为DOS程序提供更大的常规内存,也不需要反复从磁盘中恢复暂驻部分,有效地提高了系统性能。当然,如果没有加载EMM386.EXE,系统不提供UMB,COMMAND.COM的暂驻部分就只能象DOS6.22那样置于常规内存的高端。 



六、CONFIG.SYS和AUTOEXEC.BAT 



  WIN 9X中的CONFIG.SYS、AUTOEXEC.BAT的作用与DOS的一样,用于装配所有DOS实模式的驱动程序和应用程序,或者修改IO.SYS的默认配置。其中,CONFIG.SYS主要用于硬件配置,AUTOEXEC.BAT主要用于软件配置,其在启动过程中的使用参见IO.SYS一节。 



  WIN 9X启动后,这两个文件的配置作为全局设置始终保留在系统底层,决定着WIN 9X下所有的DOS、WIN 16应用环境。如果没有DOS全局设置,WINDOWS窗口下的DOS应用程序将使用WIN 9X的默认设置,当然也可由用户单独配置。注意,DOS软件需要的PATH、SET等环境设置可在各自窗口的属性中单独设置;16位的WIN 3.X软件需要的PATH、SET等环境设置只能在AUTOEXEC.BAT中设置。 



  WIN 9X新增了不少配置命令,使实模式DOS环境更便于优化,各配置命令参见系统目录\WINDOWS下的CONFIG.TXT说明,这里不再多说。 WIN 9X通过VXD(虚拟设备驱动)、DLL(动态链接库)等保护模式驱动程序统一管理和使用系统软、硬件资源,基本上不需要实模式程序支持。实模式程序主要是为支持一些老设备而保留的。实模式程序的存在使WIN 9X必须在保护模式和实模式之间频繁地转换,大大降低了系统性能,更损害了系统稳定性,所以应尽量避免在启动时装载实模式程序。 



  WIN 9X对DOS环境的缺省设置能满足大多数DOS软件需要,在完成WIN 9X安装后试着删除这两个文件中的内容非常必要。删除其中的实模式程序,尽量实现WIN 9X的保护模式驱动,可使WIN 9X处于高性能、高稳定性的优化运行状态。 



  没有CONFIG.SYS、AUTOEXEC.BAT的DOS系统几乎一无所能,而没有它们的WIN 9X性能也许更好。在WIN 9X中它们主要是为支持原DOS软件和古老的设备而保留的。目前多数报章建议完全删除这两个文件,这其实很有问题,具体分析参见《电脑界·电脑高手》'99年10月号。 



七、WIN.COM 



  WIN.COM是WINDOWS的GUI启动命令,从文件名可以看出这是一个纯粹的DOS命令,它也是GUI系统中唯一的COM文件。该命令是DOS和GUI的接口命令,主要用来加载保护模式的虚拟设备驱动程序VMM32.VXD(该程序是由多个子程序组合而成的,使CPU运行于保护模式下),同时处理GUI启动中的各种问题,它控制着系统的整个调入过程。 



WIN.COM提供的各类启动开关,主要用于确定系统故障,会使系统性能降低: 

WIN [/D: [F][M][S][V][X] 



/D 当WINDOWS不能正常启动时用于查找故障原因 



:F 关闭32位磁盘存取模式,用于不支持32位存取的硬盘 

等价于在SYSTEM.INI的[386ENH]节中设定: 32BitDiskAccess=FALSE. 



:M 安全模式启动,等价于使用功能键F5启动 



:N 带实模式网络支持的安全模式启动,等价于使用功能键F6启动 



:S 禁止Windows使用在F000:0000与1 MB之间的ROM地址空间做为断点 

等价于在SYSTEM.INI的[386ENH]节中设定: SystemROMBreakPoint=FALSE. 



:V 指定启动时由ROM例程处理硬盘控制器中断 

等价于在SYSTEM.INI的[386ENH]节中设定: VirtualHDIRQ=FALSE. 



:X 禁止WINDOWS使用所有高端内存(从A000-FFFF),解决内存冲突问题 

等价于在SYSTEM.INI的[386ENH]节中设定: EMMExclude=A000-FFFF. 



八、GUI启动 



  WIN 9X的GUI启动过程是非常复杂,更是微软公司的核心秘密,不为外人所知。而对普通用户而言,完全掌握这个复杂多变的机制也无必要,这里只对整个GUI启动机制做一个大致的说明。 



  1、GUI的配置文件 



  同所有复杂的系统一样,WIN 9X主要是根据系统配置文件调用各类程序来组合系统,保证系统正常运行的。WIN 9X的GUI系统配置文件以系统注册表为核心,以各系统目录下的INI文件为辅助配置。把握住系统配置文件,就掌握了系统的核心。 



  GUI系统的核心配置文件主要有5个,即:WIN.INI、SYSTEM.INI、SYSTEM.DAT、USER.DAT和POLICES.DAT。 



  WIN.INI和SYSTEM.INI据说是为WIN 3.X下的WIN 16保护模式程序保留的,WIN 3.X在这两个文件中的设置在WIN 9X中大部分已移入系统注册表中。WIN 9X下WIN 32保护模式程序主要通过系统注册表完成配置,不需要这两个文件的支持。这一做法规范了应用程序的开发和使用,消除了随意设置INI文件的混乱,便于WIN 9X统一管理系统,增加了系统的稳定性。但如果删除这两个文件,WIN 9X系统无法启动,并提示“找不到SYSTEM.INI文件”,这说明WIN 9X的启动还是离不开这两个文件的。 



  WIN.INI提供了WIN 16程序需要的字体设置、文件关联等种种信息,主要完成GUI下相应的环境配置,对WIN 9X应用没有太大影响,如果没有这个文件,WIN 9X将自动生成一个最简单的只有几行配置命令的WIN.INI。 



SYSTEM.INI则不同,它是WIN 16的系统硬件配置文件,WIN 9X又为其增加了一些新设置,以保证WIN 16和WIN 32相互协调,使WIN 16可以调用VXD驱动程序,这一点在WIN.COM提供的系统调试参数中已有充分体现。另外GUI的外壳程序(SHELL,即界面程序)、鼠标器、显示器等驱动程序必须通过SYSTEM.INI设置才能加载使用,这些决定了SYSTEM.INI是绝对不能删除的。这充分证明了WIN 9X是一个WIN 16和WIN 32的混合系统,也揭示了WIN 9X系统先天脆弱的根本原因。 



  WIN.INI、SYSTEM.INI中的各项设置可参见《新潮电子精华本1》。 



  SYSTEM.DAT和USER.DAT即所谓的系统注册表文件,是WIN 9X的核心文件,WINDOWS就是通过它来管理整个系统的。SYSTEM.DAT保存着硬件配置及软件安装信息,USER.DAT保存着与用户的个人设置有关的信息,前者只能有一个,而后者可以有多个。这两个文件共同作用,包含了系统的全部信息,在使用注册表编缉软件(如REGEDIT.EXE)时,这两个文件共同被修改,不能分开。它们的损坏将导致系统彻底瘫痪,无法挽救。不幸的是,系统注册表非常脆弱,缺乏自我整理和维护机制,当系统运行一段时间后,用户往往只能走上痛苦的系统重建之路。 



  在WIN 95/96/97中,注册表的备份为SYSTEM.DA0和USER.DA0,保存在\WINDOWS下;在WIN 98中,WIN.INI、SYSTEM.INI、SYSTEM.DAT和USER.DAT四个文件被合并备份成一个文件RB00?.CAB,保存在\WINDOWS\SYSBCKUP下,默认保留5个。 



  每次GUI启动时系统会对备份文件自动更新,这种处理缺乏安全管理机制,难以保证备份文件不受错误信息干扰,多数情况下备份文件形同虚设。 



  令人遗憾的是,除了手工编缉注册表软件REGEDIT.EXE,WIN 9X没有提供更有效的注册表维护工具。在WIN 98提供了注册表检测软件ScanReg.exe和ScanRegw.exe,这是一个进步,但它只能处理注册表的物理故障,无法解决结构性问题,其可靠性又有多大呢? 



  博大的注册表完全应该用一本专著来剖析,在《新潮电子精华本1》中也有简单的介绍,这里就不做更深的解释了。 



  POLICES.DAT是微软的MSN(Microsoft Network)注册支持文件,该网络国内用户很少,该文件也很少使用。 



  尽管没有更直接的资料介绍,但是有充分的理由证明在WIN 9X的启动过程中,保存在\WINDOWS\INF目录下的各种INF文件是WIN 9X系统中最有力的支持文件。在启动系统的过程中,WIN 9X会适时地调用这些文件,以装载相应的驱动程序。如果没有了这些文件,WIN 9X也是无法启动的。另外,WIN 9X的PNP技术主要是通过INF文件实现驱动程序安装的。 





   2、GUI的启动过程 



  GUI的启动过程主要由三个阶段组成:WININIT.EXE阶段、16位保护模式启动和32位保护模式启动。 



  ⑴WININIT.EXE阶段WIN.COM开始运行后,首先调用\WINDOWS下的WININIT.EXE,该命令在同目录下寻找WININIT.INI,如果有则按照该文件配制对系统文件进行重新调整或升级,以保证整个系统的驱动程序能够得到及时更新。这是WINDOWS系统支持PNP技术,实现系统驱动程序升级的主要途径。这个过程自然是在DOS状态下完成的。 



  ⑵16位保护模式启动 



  WIN.COM开始执行后,调入\WINDOWS\SYSTEM下的VMM32.VXD,VMM32.VXD将处理器置于保护模式下,根据SYSTEM.INI和注册表的配置开始启动GUI系统的16位保护模式。这可以保证系统支持WIN16软件,更主要的是PNP BIOS(即插即用BIOS)规范只提供16位保护模式接口,以PNP为硬件技术核心的WIN 9X必须通过16位模式直接获得BIOS提供的硬件设备信息来配置系统,提高系统启动性能,否则对硬件的配置必须在实模式下从头开始。 



  GUI的启动首先加载WIN 9X的系统驱动程序,再从PNP BIOS获得硬件设备信息,先后加载PNP设备驱动程序VXD和支持非PNP硬件所需的全部16位虚拟保护模式驱动程序VXD,分配系统资源,避免设备冲突,然后初始化所有的驱动程序(包括系统驱动程序和设备驱动程序),完成系统硬件配置。最后加载16位外壳组件USER.EXE、GUI.EXE、KRNL386.EXE等,形成WIN16的API,完成16位保护模式启动,此时,每个系统组件都已存在,但还不具使用界面。 



  ⑶32位保护模式启动 



  完成16位模式启动后,系统调用32位的外壳程序资源管理器,16位内核一看到这一调用,就先自动加载VWIN32.386,由它加载三个32位DLL库文件:USER32.DLL、GDI32.DLL、KERNEL32.DLL,形成WIN32的API(这是WIN 9X的核心),VWIN32.386完成这一任务后,将控制权还给16位内核,16位内核再将控制权交给32位内核,开始32位保护模式启动。这时系统加载并初始化所有32位驱动程序,这个过程与16位模式相同。 



  最后,运行GUI的外壳程序(该外壳程序由SYSTEM.INI中的[BOOT]节中“SHELL=”设置,默认是资源管理器),完成GUI启动。 



   3、GUI启动过程中故障的排除 



  GUI系统相当复杂,相关的技术资料却极少,这决定了用户不能象在DOS中那样根据启动过程去排查故障。 



  WIN 9X对GUI的启动过程从未提供详尽的说明,仅在根目录下提供了一份启动日志文件BOOTLOG.TXT。该文件记录了启动过程使用的所有程序模块的加载情况,是解决系统问题的唯一依据。根据该记录可以全面了解GUI启动过程中发生的种种问题。 



  面对启动过程中的失败,主要有两个处理方法,一是用完好的源程序覆盖出现问题的程序,但其难点在于如何在各类软件包中找到那些完好的源程序,注意,直接调试、修复出现问题的程序在WIN 9X下是难以想象的;一是从启动配置文件(CONFIG.SYS、AUTOEXEC.BAT、WIN.INI、SYSTEM.INI和注册表)中删除调用有问题模块的命令。后者主要用于解决某软件卸载失败出现的问题。 



  在图形模式GUI下解决系统问题时多会受到种种限制,而纯DOS模式不受系统制约,是最后的系统之门(对于电脑高手来说,DOS仍是永恒的主题)。 



  WINDOWS系统的复杂性决定了排除那些莫名其妙的故障的难度,若对系统经过几次调整后仍未解决问题,最保险也是最快捷的办法就是重新安装系统。也许这是微软对用户唯一有用的建议。 



  在WINDOWS下重新安装系统,要保证产品的序列号一致,否则系统可能拒绝安装。 



  九、WIN 9X启动顺序小结 



  本文详尽地讨论了WIN 9X的启动过程,复杂的参数和技术分析模糊了其清晰的体系结构,现在对整个启动过程做一简单的概括,使读者根据启动过程中的现象能够相对准确地判断启动过程,更好地处理系统启动过程中的问题。 



  ⑴系统加电启动,依次加载扩展卡(包括显卡等)、主板的BIOS程序(这与所有的操作系统(如WIN 9X、LINUX、UNIX、OS/2等)无关),完成自检过程 



  ⑵读入硬盘的主引导记录、分区引导记录,自动加载IO.SYS 



  ⑶IO.SYS读取MSDOS.SYS配置,确定启动方式,根据CONFIG.SYS,进行硬件配置 



  ⑷IO.SYS根据WIN 9X启动要求,自动加载必要的默认驱动程序(HIMEM.SYS、SETVER.EXE,IFSHLP.SYS等) 



  ⑸IO.SYS调入COMMAND.COM,解释执行AUTOEXEC.BAT,进行软件配置 





   ⑹IO.SYS进行必要的默认环境设置 



  ⑺自动执行WIN.COM,进入GUI启动阶段 



  ⑻执行WININIT.EXE,对系统驱动程序进行升级 



  ⑼加载SYSTEM.INI中[BOOT]、[386ENH]、[DEVICES]等节设置的驱动程序 



  ⑽根据SYSTEM.INI、WIN.INI和系统注册表进行系统组合、配置,各类启动时调用的VXD文件主要存放在C:\WINDOWS\SYSTEM下的VMM32和IOSUBSYS下 



  ⑾加载SYSTEM.INI中的“SHELL=”指定的外壳程序 



  ⑿执行系统注册表中的HKEY_LOCAL_MACHINE→Software→Microsoft→Windows→CurrentVersion下的Run、RunOnce中包含的应用程序(其中RUNONCE包含的程序只运行一次后就被自动删除,该键主要用于软件安装),通常默认加载Internat.exe(输入法)、Systray.exe(音量控制)和WIN 98的ScanRegw.exe/autorun。 



  ⒀当用户完成身份登录后,系统执行HKEY_CURRENT_USER→Software→Microsoft→Windows→CurrentVersion下的Run、RunOnce中包含的应用程序 



  ⒁执行WIN.INI中的LOAD= RUN=加载的应用程序 



  ⒂执行开始菜单中[启动]组包含的应用程序 



  十、结语 



  WIN 9X的启动过程终于介绍完了。由于笔者知识水平和眼界的局限,其中还是留下了许多空白就教于诸位高手。 



  诚然,这个过程本来是一个相当陈旧的话题,但是多数介绍仅限于局部技巧,且谬传颇多,比较系统完整的非常少见,这给广大电脑爱好者带来很大的困惑,这里不自量的献丑,实是纠正一些流传的误解,使电脑爱好者对WINDOWS 9X的启动过程有一个相对完整清晰的把握。 





 
最后编辑2005-03-10 19:48:55