深入解析内核 Oops:含义、触发与解读
1. 内核 Oops 概述
内核 Oops 是内核层面的重要问题标识,但它既不同于段错误(segfault),也有别于全面的内核崩溃(kernel panic)。
- 与段错误的区别 :Oops 可能会引发段错误,使进程上下文收到致命的 SIGSEGV 信号,但这只是其可能产生的副作用。
- 与内核崩溃的区别 :内核崩溃意味着系统处于不可用状态,而 Oops 不一定导致系统崩溃。不过,在某些情况下,Oops 可能会使内核变得无响应、不稳定,甚至可能最终导致内核崩溃。
内核提供了一些 sysctl 可调参数,可由 root 用户编辑,用于控制在何种情况下会触发内核崩溃。例如,在 x86_64 的 Ubuntu 20.04 系统上,可以通过以下命令查看相关参数:
$ cd /proc/sys/kernel/
$ ls panic_on_*
panic_on_io_nmi panic_on_oops panic_on_rcu_stall panic_on_unrecovered_nmi panic_on_warn
默认情况下,这些参数的值都为 0,意味着不会触发内核崩溃。但如果将 panic_on_oops
参数设置为 1,那么无论 Oops 看起来多么微不足道,内核都会崩溃。
2. 触发内核 Oops
以向空结构指针的成员写入数据