Kernel 操作系统问题

Kernel 操作系统问题,kernel,operating-system,Kernel,Operating System,我最近问自己:如果启动了一个程序,比如Mozilla Firefox,那么必须以某种方式对其进行控制。但是当程序崩溃时,为什么我的整个系统不像早期的Windows版本那样崩溃呢 Windows如何从程序中收回控制权,甚至不完全授予它 (注意:这不是我的家庭作业;我去上学,但在我的信息学课上,当我问他们关于内核的问题时,实际上只有那些回答“我能吃吗?”的人。我的老师也是如此。)通常,崩溃会导致处理器发生故障。操作系统为每一个中断都设置了处理程序,因此在这一点上,控制权会返回给操作系统 并非所有

我最近问自己:如果启动了一个程序,比如Mozilla Firefox,那么必须以某种方式对其进行控制。但是当程序崩溃时,为什么我的整个系统不像早期的Windows版本那样崩溃呢

  • Windows如何从程序中收回控制权,甚至不完全授予它

(注意:这不是我的家庭作业;我去上学,但在我的信息学课上,当我问他们关于内核的问题时,实际上只有那些回答“我能吃吗?”的人。我的老师也是如此。)

通常,崩溃会导致处理器发生故障。操作系统为每一个中断都设置了处理程序,因此在这一点上,控制权会返回给操作系统

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

  • 忽略它并允许程序继续运行
  • 关闭程序并(大多数操作系统)通知用户
  • 如果程序导致操作系统无法忽略的中断,则为

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

这就是关于环和异常的故事。访问冲突会将控制权交给预先设置的操作系统处理程序来决定该做什么。一个程序也可以设置一个处理程序,但如果它不设置,它就是一个未处理的访问冲突,这就是所谓的崩溃

在某些情况下,这样的机制是用来做好事的。例如,当磁盘不匹配实际内存时,页面错误就是这样工作的。操作系统捕获访问冲突并加载所需内容,然后恢复程序执行,就好像什么都没发生一样

其他事情可能会导致崩溃

操作系统还将捕获无效指令。如果它是来自更新的、还不受CPU支持的指令集的有效指令,操作系统将在软件中实现它。否则,它将声明一个未处理的异常并关闭进程

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


蓝屏是由于故意调用一个特殊函数,称为KeBugCheckEx()。这将由在内核模式下运行的内核或设备驱动程序完成。这是为了宣布他们自己达到了一个不一致的逻辑状态,他们非常重要,相信这是立即关闭整个系统的一个重要原因,以避免进一步损坏硬件或其他组件

这是因为现代操作系统在虚拟环境中运行用户(而不是内核)进程。一个进程可以访问全部可寻址内存范围(这是一个粗略的简化),但事实并非如此。它也使用CPU,但是内核控制所有进程,所以CPU在所有进程之间或多或少公平地共享(再次简化),所以这是一种虚拟CPU。进程不直接与硬件通信,而是通过内核“API”


内核在硬件的帮助下(用于内存访问和特权指令评估)保护自身和用户进程彼此不受影响。对内核来说,用户级进程终止并发生崩溃是一个正常的、定义良好的事件。

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

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

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

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

  • 从不允许的内存地址读取
  • 此特定应用程序的内存不足(但是,分页主要解决此问题)
  • 尝试执行不可执行的内存(例如,数据)
  • 跳转到无效地址(例如在机器指令的中间)
Windows构造由处理器上的内存管理单元(MMU)使用的特殊表,其中包含有关当前进程可以访问的内存区域的信息。对于每个过程,此表是不同的。显然,因为每个进程驻留在内存中的不同位置,它必须能够访问自己的数据和代码


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

在早期的windows中,进程之间没有真正的隔离,也没有真正的抢占式调度。多进程