操作系统问题

时间:2010-04-10 18:01:41

标签: kernel operating-system

我最近问过自己:如果某个程序(例如Mozilla Firefox)启动了 - 控件必须以某种方式给予它。但是当程序崩溃时,为什么我的整个系统不会像早期的Windows版本一样崩溃?

  • Windows如何从程序中收回控件,甚至不能完全将其提供给它?

(注意:这不是我的功课;我上学但是在我的信息学课上,当我向他们询问内核时,我真的只会回答“我可以吃那个吗?”。与我的老师相同。)< / p>

5 个答案:

答案 0 :(得分:2)

这是关于戒指和例外的故事。访问冲突会将控制权交给预先设置的OS处理程序来决定做什么。程序也可以设置一个处理程序,但如果没有,则是未处理的访问冲突,这是你称之为崩溃的事情之一。

在某些情况下,这种机制用于做好事。例如,当磁盘模仿实际内存时,这就是页面错误的工作方式。操作系统捕获访问冲突并加载所需的东西,然后恢复程序执行,就像没有发生任何事情一样。

其他事情可能会导致崩溃。

操作系统也会捕获无效指令。如果它是来自较新的,尚未支持(由CPU)指令集的有效指令,则OS将在软件中实现它。如果没有,它将声明一个未处理的异常并关闭你的进程。

从未以正常模式运行的进程访问硬件端口也会导致程序崩溃。

蓝屏是故意调用特殊功能引起的,称为KeBugCheckEx()。这将由在内核模式下运行的内核或设备驱动程序完成。这是为了宣布它们达到了一个不一致的逻辑状态,并且它们非常重要,可以相信这是立即降低整个系统的一个很好的理由,以避免进一步损坏硬件或其他组件。

答案 1 :(得分:1)

通常,崩溃会导致处理器中出现interrupt。操作系统为每个中断设置了处理程序,因此在那时控制权将返回给操作系统。

并非所有中断都是错误的(例如,用于从磁盘/网络读取的IO中断)。但是,当操作系统遇到错误的中断时,它会:

关于操作系统如何无法完全控制程序:现代处理器有一个标志(称为PE bit),用于确定进程是以完全权限(内核模式)还是有限权限(用户模式)运行)。用户模式程序彼此隔离,并且必须通过OS(“系统调用”)

相互通信

答案 2 :(得分:1)

实际上非常简单。由于Windows是一个多任务操作系统,因此它会不断地(从每个X毫秒)切换一个应用程序到下一个应用程序。通过非常短的时间运行每个程序,它会产生程序同时工作的错觉。

当应用程序挂起时,应用程序可能处于一个很长的(可能是无限的)循环中。 Windows一直在给应用程序运行很短的时间,并且没有注意到这一点(除非您想要与应用程序进行交互,并且它不会在一秒钟内响应)。这是第一种“崩溃”。

在第二种类型中,实际崩溃,发生了一些严重错误,因此Windows无法让程序继续运行。例如,程序尝试写入为某些其他程序或Windows本身保留的内存区域。处理器有一个内置机制,当发生这种情况时会产生一个中断(处理器的事件)。 Windows被编程为对此中断作出反应,并且因为它无法解决问题,它会将程序视为“崩溃”并立即终止。

如上所述,写入错误的存储器地址会自动导致处理器发生(保护)中断。其他可能导致不可恢复错误中断的事情包括:

  • 从不允许的内存地址读取
  • 此特定应用程序的内存不足(但是,分页主要消除此问题)
  • 尝试执行不可执行的内存(例如,数据)
  • 跳转到无效地址(例如在机器指令中间)

Windows构造处理器上的内存管理单元(MMU)使用的特殊表,其中包含有关当前进程可以访问的内存区域的信息。对于每个流程,此表都不同。显然,因为每个进程都驻留在内存中的不同位置,并且必须能够访问自己的数据和代码。

因此,使用特殊访问表的操作系统与处理器触发的保护中断相结合,主要是程序不使用整个操作系统的原因。否则,分时允许其他操作系统和程序在程序挂起时继续。

答案 3 :(得分:1)

在早期的窗口中,进程之间没有真正的隔离,也没有真正的抢占式调度。多个进程共享系统资源,称为“协作式多任务处理”。因此,如果一个过程停止了合作,即使偶然,你的整个系统都是干杯。

现代操作系统(和Windows,无论如何,因为NT / 2K)通过使用虚拟内存将进程彼此隔离,并且通过称为抢占式多任务处理的硬件中断驱动计时机制周期性地将控制从一个进程传输到下一个进程。如果一个进程变得疯狂并进入紧密循环,那么在dud进程被抢占之前,只是时间(毫秒!),操作系统获得控制权,并将其转移到下一个进程。如果一个进程变得狂暴并且取消引用一个坏指针,它就不会破坏另一个进程的数据,因为内存管理单元(MMU)将每个进程的虚拟内存映射到不同的物理内存区域。

现在,检测程序何时脱轨是另一回事。也许你想要在一个紧密的循环中旋转,是否由操作系统决定是否崩溃?所以一般来说,你没有看到一个程序进入循环终止,但你会看到它加载了CPU。多少负载取决于OS调度程序的细节,但一般是系统士兵。坏指针更容易识别,空指针是最明显的指针。现代CPU通常具有段描述符,可用于识别何时尝试非法内存引用,例如,耗尽分配给该进程的所有堆栈空间。 MMU通常允许程序相当自由地访问地址空间,但是如果操作系统设计者需要,MMU可以配置为使某些虚拟地址不受限制,并且如果程序试图访问其中一个区域,则会出现例外情况。结果将使操作系统立即掌握控制并处理违规过程。

答案 4 :(得分:0)

这是因为现代操作系统在虚拟环境中运行用户(而不是内核)进程。进程可以访问完整的可寻址内存范围(这是一个严格的简化),但那是virtual memory。它还利用CPU,但内核time-slices所有进程,因此CPU在所有进程中或多或少地公平共享(再次简化),因此这是一种虚拟CPU 。进程不直接与硬件通信,而是通过内核syscall“API”。

内核在硬件的帮助下(MMU用于内存访问,user/supervisor separation用于特权指令评估)保护自身和用户进程。使用崩溃终止用户级进程是内核的正常,明确定义的事件。