我最近问自己:如果启动了像Mozilla这样的程序,就必须以某种方式将控件交给它。但是当程序崩溃时,为什么我的整个系统不像早期的Windows版本那样崩溃呢?
(注:这不是我的作业;我上学,但在我的信息学课上,真的只有那些人会回答“我能吃那个吗?”)当我问他们关于谷物的事时。)我的老师也是如此。)
发布于 2010-04-10 18:16:32
这就是关于戒指和例外的故事。访问冲突将向预先设置的OS处理程序抛出控制,以决定要做什么。程序也可能设置处理程序,但如果不设置,则是未处理的访问冲突,这是您所称的崩溃事件之一。
在某些情况下,这样的机制被用来做好事。例如,当磁盘发送实际内存时,这就是页面错误的工作方式。操作系统捕获访问冲突并加载所需的内容,然后恢复程序执行,就好像什么都没有发生一样。
其他的东西可能会导致坠机。
操作系统也将捕获无效指令。如果它是来自较新的、尚未被CPU支持的指令集的有效指令,OS将在软件中实现它。如果没有,它将声明一个未处理的异常并关闭您的进程。
从没有以正确模式运行的进程访问硬件端口,也会导致程序崩溃。
蓝色屏幕是由故意调用一个名为KeBugCheckEx()的特殊函数引起的。这将由在内核模式下运行的内核或设备驱动程序来完成。这是为了宣布他们自己达到了一个不一致的逻辑状态,而且他们非常重要,他们相信这是一个很好的理由让整个系统立即瘫痪,以避免对硬件或其他组件的进一步破坏。
发布于 2010-04-10 18:05:37
通常,崩溃将导致处理器中发生中断。操作系统为这些中断中的每一个设置了处理程序,因此此时将控制返回给OS。
并不是所有的中断都是坏的。IO中断从磁盘/网络读取)。但是,当操作系统遇到一个坏的中断时,它会:
至于操作系统如何不能完全控制程序:现代处理器有一个标志(称为PE钻头),它决定进程是以完全权限(内核模式)还是以有限权限(用户模式)运行。用户模式程序彼此隔离,必须通过OS (“系统调用”)相互通信。
发布于 2010-04-10 19:00:38
其实很简单。因为Windows是一个多任务操作系统,它不断地从一个应用程序切换到下一个应用程序(每一个X毫秒)。通过给每个程序一个非常短的运行时间,它创造了一种错觉,即程序同时工作。
当应用程序挂起时,应用程序可能处于一个长(可能是没完没了的)循环中。Windows总是给应用程序一个很短的运行时间,并且没有注意到这一点(除非您希望与应用程序交互,并且它不会在一秒钟内响应)。这是第一种“崩溃”。
在第二种类型,真正的崩溃,一些严重的错误发生,使Windows不能让程序继续。例如,该程序尝试将内存区域写入某个其他程序或Windows本身。处理器有一个内建机制,当这种情况发生时,它会产生一个中断(对处理器来说是一种事件)。Windows被编程来对这个中断作出反应,因为它没有办法解决这个问题,所以它会将程序视为“崩溃”并立即终止它。
如前所述,写入错误的内存地址会导致处理器自动中断(保护)。其他可能导致无法恢复的错误中断的事情包括:
Windows构建由处理器上的内存管理单元(MMU)使用的特殊表,该表包含有关当前进程可以访问的内存区域的信息。对于每个进程,此表是不同的。显然,因为每个进程驻留在内存中不同的位置,而且它必须能够访问自己的数据和代码。
因此,使用专用访问表的操作系统,再加上处理器触发的保护中断,主要是程序不带整个操作系统的原因。否则,分时处理允许在程序挂起时继续执行操作系统和程序的其余部分。
https://stackoverflow.com/questions/2614339
复制相似问题