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
状态的任务)x
:powerpc
上用的y
:sparc-64
上用的z
:打印ftrace
缓冲区内容0
-9
:设置控制台日志级别,控制哪些内核信息将被打印到控制台
每一个
sysrq
的键对应的后面的代码其实都挺庞大的,比如panic
、oom 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
相关的选项才有,暂时不看。