linux内核中panic函数
时间: 2025-08-04 21:22:44 浏览: 17
在 Linux 内核中,`panic()` 函数是一个用于**致命错误处理**的重要函数。当内核遇到无法恢复的错误(如硬件故障、严重内存错误、断言失败等)时,就会调用 `panic()` 函数,通知系统发生了严重错误,并尝试**停止系统运行**或**重启系统**。
---
### 函数原型(定义在 `kernel/panic.c`):
```c
void panic(const char *fmt, ...) __noreturn;
```
- `__noreturn` 表示该函数不会返回,调用后程序流程不会继续执行。
---
### 主要功能:
1. **打印错误信息**
- 使用 `printk()` 打印传入的错误信息和内核日志。
2. **触发 oops 或崩溃处理流程**
- 如果配置了 `CONFIG_DEBUG_BUGVERBOSE`,会打印出错的文件名和行号。
- 如果启用 Kdump,会触发 kexec,加载 crash kernel。
3. **暂停或重启系统**
- 默认情况下,内核会进入死循环,停止所有任务。
- 如果设置了 `panic_timeout`(通过内核参数 `panic=N`),则会在 N 秒后自动重启。
---
### 示例代码:
```c
if (some_critical_error) {
panic("Critical error: Memory corruption detected!");
}
```
---
### 调用栈示例(日志输出):
```
Kernel panic - not syncing: Critical error: Memory corruption detected!
CPU: 0 PID: 1 Comm: swapper Not tainted 5.10.0 #1
Hardware name: ARM-Virtual
[<ffffff8008012340>] dump_backtrace+0x0/0x190
[<ffffff80080124e0>] show_stack+0x14/0x20
[<ffffff80080a1234>] panic+0x124/0x320
[<ffffff80080b5678>] some_critical_function+0x50/0x80
```
---
### 相关配置选项:
| 配置项 | 说明 |
|--------|------|
| `CONFIG_PANIC` | 是否启用 panic 功能 |
| `CONFIG_PANIC_TIMEOUT` | 设置 panic 后自动重启的秒数 |
| `CONFIG_KEXEC` | 支持 kexec,panic 后加载 crash kernel |
| `CONFIG_CRASH_DUMP` | 支持生成 crash dump 文件用于调试 |
---
### 设置 panic 后自动重启:
在内核启动参数中添加:
```bash
panic=10
```
表示内核 panic 后 10 秒自动重启。
---
### panic 与 BUG、WARN 的区别:
| 函数 | 行为 | 是否可恢复 | 用途 |
|------|------|------------|------|
| `panic()` | 打印信息并停止系统 | 否 | 致命错误 |
| `BUG()` | 强制触发内核 oops | 否 | 断言失败 |
| `WARN()` | 打印警告信息 | 是 | 非致命错误 |
| `WARN_ON()` | 条件为真时警告 | 是 | 调试用途 |
---
###
阅读全文
相关推荐




















