内核错误

内核错误(英語:Kernel Panic)是指操作系统在监测到内部的致命错误,且无法安全处理此错误时采取的动作。这个概念主要被限定在Unix以及类Unix系统中;对于Microsoft Windows系统,等同的概念通常被称为蓝屏死机

init发送SIGSEGV使其退出,导致FreeBSD中发生的内核错误。

操作系统内核中处理Kernel panic的子程序(在AT&T衍生类以及BSD类Unix中,通常称为panic())通常被设计用来向控制台输出错误信息,向磁盘保存一份内核内存的转储,以便事后的调试,然后等待系统被手动重新引导,或自动重新引导。该程序提供的技术性信息通常是用来帮助系统管理员或者软件开发者诊断问题的。

操作系统试图读写无效或不允许的内存地址是导致内核错误的一个常见原因。内核错误也有可能在遇到硬件错误或操作系统BUG时发生。在不同情况中,操作系统可以在内存访问违例发生时继续运行。然而,系统处于不稳定状态时,操作系统通常会停止工作以避免造成破坏安全和数据损坏的风险,并提供错误的诊断信息。

内核错误在早期的Unix系统中被引入,显示了在Unix与Multics在设计哲学上的主要差异之一。Multics的开发者Tom van Vleck曾引述了一段在这个问题上与Unix开发者Dennis Ritchie的讨论:

我提醒Dennis说,我在Multics中写的近半数代码都是错误恢复代码。他说:“我们不需要这些。我们有称为panic的子程序,如果发生了错误就可以调用这个函数,使得系统崩溃,然后你可以在大厅里面大叫:‘嘿,重启机器’。”[1]

原始的panic()函数从UNIX第五版开始到基于VAX的UNIX 32V期间几乎没有变化,只是输出一条错误信息,然后就使系统进入NOP的死循环中。当改进UNIX的基础代码的时候,panic()函数也有所改进,可以向控制台输出多种格式的调试信息。

Mac OS X

Mac OS X v10.6 Snow Leopard中,当进入内核错误后,会在畫面上出现一個有英語法語德語西班牙语日語的當機畫面,被多数麥金塔電腦使用者称为“五國語言當機”,简称“五国”。同时,调试信息被存储在NVRAM中,并会在重启时写出日志文件。

出现这样的问题除了是作業系統上的問題,絕大多數是擴充記憶體出現問題,但亦有可能是其他硬件出現問題。此画面亦多发生于黑苹果安装过程中。通常重新開機即可解決問題,但有時候必須被送去維修才可以解決問題。

Mac OS X v10.310.5版本中,死机画面没有西班牙语,只包含英語、法語、德語及日語四种语言,因此被称为“四國語言當機”,简称“四国”,由于使用时间较长,可能是多数用户习惯的名称。

OS X v10.8 Moutain Lion和之後的版本,除了原有的英語、法語、德語、西班牙语及日語外,又增加簡體中文的語系。

Linux内核oops

在Linux上,oopsLinux内核的行为不正确,并产生了一份相关的错误日志。许多类型的oops会导致内核错误,即令系统立即停止工作,但部分oops也允许继续操作,以保证系统的稳定性。这个概念只代表一个简单的错误

当内核检测到问题时,它会打印一个oops信息然后终止全部相关进程。oops信息可以帮助Linux内核工程师调试,检测oops出现的条件,并修复导致oops的程序错误。

Linux官方内核文档中提到的oops信息被放在内核源代码Documentation/oops-tracing.txt[2]。通常klogd是用来将oops信息从内核缓存中提取出来的,然而,在某些系统上,例如最近的Debian发行版中,rsyslogd代替了klogd,因此,缺少klogd进程并不能说明log文件中缺少oops信息的原因。

若系统遇到了oops,一些内部资源可能不再可用。即使系统看起来工作正常,非预期的副作用可能导致活动进程被终止。内核oops常常导致内核错误,若系统试图使用被禁用的资源。

Kernelloops提到了一种用于收集和提交oops到其网站的软件[3] 。Kerneloops.org同时也提供oops的统计信息[4]

参见

参考文献

外部連結