尽管内核代码的大部分 bug 以 oops 消息结束, 有时候它们可能完全挂起系统. 如果系 统挂起, 没有消息打印. 例如, 如果代码进入一个无限循环, 内核停止调度,[15]15 并且系 统不会响应任何动作, 包括魔术 Ctrl-Alt-Del 组合键. 你有 2 个选择来处理系统挂起 -
- 或者事先阻止它们, 或者能够事后调试它们.
你可阻止无限循环通过插入 schedule 引用在战略点上. schedule 调用 ( 如你可能猜到 的 ) 调度器, 因此, 允许别的进程从当前进程偷取 CPU 数据. 如果一个进程由于你的驱 动的 bug 而在内核空间循环, schedule 调用使你能够杀掉进程在跟踪发生了什么之后.
你应当知道, 当然, 如何对 schedule 的调用可能创造一个附加的重入调用源到你的驱动, 因为它允许别的进程运行. 这个重入正常地不应当是问题, 假定你在你的驱动中已经使用 了合适的加锁. 然而, 要确认在你的驱动持有一个自旋锁的任何时间不能调用 schedule.
如果你的驱动真正挂起了系统, 并且你不知道在哪里插入 schedule 调用, 最好的方式是 加入一些打印消息并且写到控制台(如果需要, 改变 console_loglevel 值).
有时候系统可能看来被挂起, 但是没有. 例如, 这可能发生在键盘以某个奇怪的方式保持 锁住的时候. 这些假挂起可通过查看你为此目的运行的程序的输出来检测. 一个你的显示 器上的时钟或者系统负载表是一个好的状态监控器; 只要他继续更新, 调度器就在工作.
对许多的上锁一个必不可少的工具是 "魔术 sysrq 键", 在大部分体系上都可用. 魔键 sysrq 是 PC 键盘上 alt 和 sysrq 键组合来发出的, 或者在别的平台上使用其他特殊键 (详见 documentation/sysrq.txt), 在串口控制台上也可用. 一个第三键, 与这 2 个一 起按下, 进行许多有用的动作中的一个:
r 关闭键盘原始模式; 用在一个崩溃的应用程序 ( 例如 X 服务器 ) 可能将你的键盘搞成 一个奇怪的状态.
k 调用 "安全注意键"( SAK ) 功能. SAK 杀掉在当前控制台的所有运行的进程, 给你一个 干净的终端.
s 进行一个全部磁盘的紧急同步.
u umount. 试图重新加载所有磁盘在只读模式. 这个操作, 常常在 s 之后马上调用, 可 以节省大量的文件系统检查时间, 在系统处于严重麻烦时.
b boot. 立刻重启系统. 确认先同步和重新加载磁盘. p 打印处理器消息.
t 打印当前任务列表. m 打印内存信息.
实际上, 多处理器系统仍然在其他处理器上调度, 甚至一个单处理器的机器可能重新调度, 如果内核抢占被使能.
然而, 对于大部分的通常的情况( 单处理器不使能抢占), 系统一起停止调度.
来源: http://www.bubuko.com/infodetail-3114814.html