只要是使用过Windows 95或Windows 98的用户,我估计没有遇到过一般性保护错(GPF)的人几乎没有。当一个程序试图访问其内存地址空间之外的内存时,就会引发这种错误,每当发生这种错误,系统就会提示:程序执行了非法操作。这时我们该怎么办呢?下面是针对不同程序的GPF而分别采取的处理办法。
1.基于MS-DOS程序中的GPF
由于每个MS-DOS程序只在独自的虚拟机上运行,故基于MS-DOS的程序出现一般性保护错后,受影响的仅仅是该MS-DOS程序。因此,当这类程序出现GPF后,用户只须在GPF对话框中单击“关闭”按钮,就将终止该MS-DOS程序以及运行它的虚拟机而收回被该程序调用的系统资源。
点击GPF对话框中的“详细资料”按钮,系统将提供一些堆栈转储数据,这些堆栈转储数据是在程序崩溃时存储在系统寄存器中的消息,该信息一般只对编写程序的人有用。
2.16位Windows程序中的GPF
由于基于Windows的所有16位程序享用相同的地址空间,故只要一个16位程序出现GPF,则其他正在运行的16位Windows程序都将因此而终止。只有将出现GPF的16位程序清除后,其他16位程序才能继续读线程中的消息和正常进行操作。
由于所有16位的Windows程序共享相同的资源,因此即使将出现故障的16位程序关闭,通常也不能把资源彻底返回操作系统,而这些不能回收的资源又可能造成另外的16位Windows程序出现GPF。故当16位Windows程序出现GPF时,要彻底收回系统资源,唯一的办法是关闭所有的16位Windows程序。
当16位Windows程序出现故障时,Windows系统也将发出指示故障的程序的GPF对话框,该对话框是基于Windows 3.1旧类型的对话框,由“关闭”按钮和“忽略”按钮所构成。用户选择“关闭”按钮后,将看到Windows 95/98 GPF的对话框。3.32位Windows程序中的GPF
虽然所有的32位Windows程序都使用同一个系统虚拟机,但是它们都有单独的虚拟地址空间,所以当32位Windows程序出现GPF故障时,不会对其他任何程序产生影响。
要收回出现GPF故障的32位Windows程序占用的系统资源,用户只须在出现的“Windows 95/98 GPF”对话框中单击“关闭”按钮,Windows就会关闭出错的程序并把其资源返回操作系统。4.设备驱动程序中的GPF
设备驱动程序中也会出现GPF。由于设备驱动程序能直接访问硬件并作为基本操作系统的一部分运行,所以当设备驱动程序出现GPF故障后,将会影响整个Windows系统的稳定和继续正常运行。因此设备驱动程序出现了一般性保护错后,最好的解决办法就是重新启动系统。 将详细讲讲如何跟踪虚拟机,看看理论是否与事实相吻合。
1.点击“开始/附件/系统工具”中的“系统监视器”。
2.打开“系统监视器”中的“编辑”菜单,选择“添加项目(A)”选项。
3.选择“核心”类别中的“虚拟机”项目,单击“确定”按钮,即可利用“系统监视器”查看“虚拟机”的运行状态。
4.从下面的介绍中,我们可以看到Windows程序和MS-DOS程序调用虚拟机的真实情况:程序调用情况:只运行了Windows 98系统。
虚拟机运行情况:只调用了系统虚拟机。
说明:Windows系统的系统程序只在系统虚拟机中运行。
程序调用情况:打开了Word97和Photoshop4.0程序。
虚拟机运行情况:仍然只调用了系统虚拟机。
说明:基于Windows的所有程序(无论是16位还是32位程序)均在系统虚拟机中运行。
程序调用情况:在上个基础上调用了一个MS-DOS程序。
虚拟机运行情况:调用了系统虚拟机和一个MS-DOS虚拟机。
说明:从图中可以看出,MS-DOS程序不在系统虚拟机中运行,而是单独调用一个MS-DOS虚拟机运行,并且一个MS-DOS虚拟机的峰值为1。程序调用情况:在上个基础上再打开了一个MS-DOS程序。
虚拟机运行情况:调用了系统虚拟机和两个MS-DOS虚拟机。
说明:基于MS-DOS的程序并不是在同一个MS-DOS虚拟机中运行。一个MS-DOS虚拟机中只能运行一个MS-DOS程序,而且MS-DOS虚拟机相互之间互不干扰。
总结:Windows系统中的所有程序只能在系统虚拟机和MS-DOS虚拟机中运行!程序的不响应又称为程序被挂起,那么,什么叫程序的不响应呢?形象地说,就是某个正在运行的程序非正常地停留在某一状态,而又不对系统作出相应的反应,就仿佛死了一般。与出现GPF故障的程序不同的是,被挂起的程序并不会被系统强制终止,而是在继续运行,但不会对系统作出响应。
造成程序“不响应”的原因是多方面的,但有一点是我们应该了解的,那就是线程的阻塞是造成程序挂起的主要因素,而不是虚拟机的问题。另外一些其他原因也能造成程序被挂起,如造成16位Windows程序被挂起可能是该程序不能与别的16位程序共享资源,或者因其他的16位程序出现GPF而没有得到及时消除造成:32位的Windows程序所需资源被其他程序使用时也会出现程序不响应故障。从而我们可以看到,如果一个程序在使用一个关键资源时被挂起,则所有其他需要该资源的程序也将被挂起。挂起的程序必须关闭以释放其占用的资源后,其他程序才能够继续运行。
[1] [2]
下面就是不同程序出现不响应故障后的解决措施。
挂起的MS-DOS程序
由于每个MS-DOS程序使用独自的MS-DOS VM,而每个MS-DOS VM拥有单独的线程(注:每个MS-DOS VM拥有2个线程)。因此,当一个MS-DOS程序被挂起时,其他的MS-DOS程序仍能正常运行。要关闭被挂起的MS-DOS程序,用户只需同时按下CTR l+ALT +del键,调出图1界面,然后选中被挂起的MS-DOS程序,单击“结束任务”按钮即可。
挂起的16位Windows 程序
16位Windows 程序被挂起时,它们一般不会释放对线程和其它系统资源的控制,又由于16位Windows程序共享单个线程。因此,当一个16位Windows 程序被挂起后,可能导致越来越多的16位Windows 程序被挂起。所以,必须将所有的被挂起的16位Windows程序关闭后,其它的16位程序才能继续正常运行。
另外,Windows 9X系统使用Win16Mutex标志来指示某个特定的16位Windows 程序正在使用的资源。Win16Mutex标志的出现会产生一个副作用,即当被挂起的16位Windows 程序被释放后,会产生一些16位代码碎片,如果32位的Windows程序正准备使用这些碎片,则可能会被其他试图使用相同碎片的16位程序挂起。
因此,当16位程序被挂起时,最稳妥的方法是重新启动计算机。
挂起的32位Windows 程序
32位Windows 程序被挂起时,则不起影响其他32位Windows程序!这主要是因为它们拥有独自的线程。因此,当一个32位Windows 程序被挂起后,只需按三键组合,点击“结束任务”按钮将其关闭即可。
(出处:http://www.sheup.com)
[1] [2]