Heng30的博客
搜索 分类 关于 订阅

如何进行Linux驱动调试-oops?

2025-02-25

oops是Linux内核中用于处理严重错误的机制。当内核检测到无法恢复的错误(如空指针解引用、非法内存访问等)时,会触发oops,打印当前状态信息(如寄存器、堆栈、调用链等),并尝试继续运行系统(而非直接崩溃)。

功能与作用

  • 错误报告:在发生严重错误时,打印详细的调试信息(如寄存器、堆栈、指令指针等)。

  • 系统恢复:尝试终止导致错误的进程,避免整个系统崩溃。

  • 调试辅助:帮助开发者定位内核代码中的问题。

触发条件

  • 空指针解引用(NULL pointer dereference)。

  • 非法内存访问(访问未映射或只读内存)。

  • 除零操作(division by zero)。

  • 未处理的硬件异常(如未对齐内存访问)。

  • 显式调用BUG()panic()

相关函数

  • BUG():触发无条件oops

  • BUG_ON(condition):当条件为真时触发oops

  • panic():触发oops并终止系统运行。

  • WARN_ON():触发警告并打印堆栈,但不终止进程。

输出信息

Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = ffffffc000000000
[00000000] *pgd=0000000000000000, *pud=0000000000000000
Internal error: Oops: 96000004 [#1] PREEMPT SMP
CPU: 0 PID: 1234 Comm: my_module Tainted: G        W  O    4.19.0
...
Call Trace:
[<ffffffc000123456>] my_buggy_function+0x20/0x30
[<ffffffc000654321>] init_module+0x14/0x1000