sysrq阅读记录

sysrq

使用

内核文档中有说如何使用:

在这里插入图片描述

  • b :立即重启系统,无同步或卸载磁盘的操作
  • c :通过写NULL指针手动触发系统崩溃。如果配置了crashdump,会生成crashdump
  • d :显示所有持有的锁
  • e :将SIGTERM信号发送给所有进程,初始化init进程和内核进程除外
  • f :调用oom killer杀死内存消耗进程,如果没有杀死进程也不会触发panic
  • g :由内核kdgb使用
  • h :显示帮助信息
  • i :发送SIGKILL信号给所有进程,初始化init进程和内核进程除外
  • j :强制解冻ioctl(FIFREEZE)冻结的文件系统
  • k :安全访问秘钥(SAK)杀死当前虚拟终端(虚拟控制台)上的所有进程
  • l :显示所有活动CPU的堆栈回溯
  • m :将内存信息打印在当前终端
  • n :用于修改RT实时任务的nice值修改
  • o :关闭系统(如果配置支持的话)
  • p :打印当前寄存器和标志
  • q :打印每个CPU在使用的高精度定时器hrtimer列表(不是普通的定时器)
  • r :关闭键盘原始模式,并设置为XLATE
  • s :尝试同步所有已挂载的文件系统
  • t :打印当前任务列表及信息
  • u :尝试以只读的方式重新挂载所有文件系统
  • v :强制还原帧缓冲控制台;打印ETM缓冲区的信息(ARM特定)
  • w :打印不可打断的任务(blocked-D状态的任务)
  • xpowerpc上用的
  • ysparc-64上用的
  • z :打印ftrace缓冲区内容
  • 0-9 :设置控制台日志级别,控制哪些内核信息将被打印到控制台

每一个sysrq的键对应的后面的代码其实都挺庞大的,比如panicoom killer、堆栈信息和寄存器信息打印等,每一块后面的代码都需要花很多时间去阅读,后续有机会的话慢慢补上。

初始化

sysrq初始化入口:

在这里插入图片描述

proc文件创建:

在这里插入图片描述

proc输入参数处理:
在这里插入图片描述

判断是否开启sysrq功能:

在这里插入图片描述

sysrq注册处理:

在这里插入图片描述

读取设备树的配置,用一组按键来检测是否需要去复位系统,类似于Linux重启密码。

在这里插入图片描述

connect时注册工作队列任务以及定时器任务:

在这里插入图片描述

初始化的工作任务,给connect注册的handle发送事件:

在这里插入图片描述

定时器任务是同步后进行重启:处理按键发现是重启后如果有设置重启延时,那么延时一段时间后重启。

在这里插入图片描述

sysrq断开连接时,对相应的资源进行释放:

在这里插入图片描述

过滤器过滤事件,对于EV_KEY按键事件,调用sysrq_handle_keypress()进行处理:

在这里插入图片描述

这里就对按键按下进行处理:

在这里插入图片描述

在这里插入图片描述

根据不同的按键去获取对应的操作集:

在这里插入图片描述

在这里插入图片描述

获取操作集的过程:

在这里插入图片描述

不同范围的key在数组中的位置需要减去不同的基数:

在这里插入图片描述

操作列表

在这里插入图片描述

在这里插入图片描述

更改log等级

在这里插入图片描述

这个console_loglevel是在printk.h头文件中定义的,暂时就先不关注了,后续如果看printk的代码的话可以多了解一下。

在这里插入图片描述

重启

在这里插入图片描述

lockdep_off是配置了CONFIG_LOCKDEP死锁检测时会用到;local_irq_enable关中断。

重启内核最后还是走的machine_restart(),在arm64重启的文档中有分析过一下过程,这里就不写了。

在这里插入图片描述

在这里插入图片描述

强制触发panic

在这里插入图片描述

乖乖,强制往空指针里面写数据,后面应该会触发ARM64的异常,具体的异常流程还不了解,后续可以学习一下,目前来看只有arch/arm64/kernel/traps.c里面的die函数:

在这里插入图片描述

打印相关锁信息

在这里插入图片描述

打印相关锁信息的函数:

在这里插入图片描述

在这里插入图片描述

打印进程信息及锁信息:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

发送SIGTERM终止进程信号

在这里插入图片描述

略过内核进程和init进程发送SIGTERM信号:

在这里插入图片描述

人为触发OOM Killer

在这里插入图片描述

人为发送SIGKILL信号

在这里插入图片描述

SIGTERM信号一样,忽略内核进程和init进程。

对设备进行解冻

在这里插入图片描述

遍历所有超级块设备执行thaw_bdev()

在这里插入图片描述

thaw_bdev()看注释是解锁文件系统:

在这里插入图片描述

虚拟终端授信

在这里插入图片描述

暂时不了解。

打印所有CPU的寄存器信息和堆栈信息

在这里插入图片描述

打印寄存器信息:

在这里插入图片描述

打印栈回溯信息:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

打印内存信息

在这里插入图片描述

遍历pgd以及pgd下的zone区打印内存信息:

在这里插入图片描述

对实时线程的nice值进行修改

在这里插入图片描述

将用户的实时进程的nice值改为0:

在这里插入图片描述

打印寄存器信息

在这里插入图片描述

打印定时器相关信息

在这里插入图片描述

遍历每个CPU打印相关的定时器事件信息:

在这里插入图片描述

复位键盘模式

在这里插入图片描述

暂时不看。

紧急同步

在这里插入图片描述

遍历所有超级块以及块设备同步:

在这里插入图片描述

打印进程信息

在这里插入图片描述

在这里插入图片描述

遍历所有进程,过滤后打印进程信息:

在这里插入图片描述

暂时不细看了:

在这里插入图片描述

重新挂载所有文件系统为只读

在这里插入图片描述

遍历所有超级块,将非只读的超级块挂载为只读:

在这里插入图片描述

打印blocked(D)进程信息

在这里插入图片描述

通打印进程信息,多了一个过滤条件TASK_UNINTERRUPTIBLE

打印traceing信息

在这里插入图片描述

开启了ftrace相关的选项才有,暂时不看。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值