当执行 echo "X" > /proc/sysrq-trigger 的时候, 这个X究竟有些什么值可以输入?

1 当执行 echo “X” > /proc/sysrq-trigger 的时候, 这个X究竟有些什么值可以输入?

1.2 具体定义如下,每一个操作码都对应一个处理函数, “NULL” 就表示发了也白搭:-), 空的,没人干活呀.虽然没人干活,发个提醒还是需要的,所以在message里面能看到类似help的信息).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
static struct sysrq_key_op *sysrq_key_table[36] = {
&sysrq_loglevel_op, /* 0 顾名思义就是设置console的log级别了 其实就是console_loglevel = key - '0';*/
&sysrq_loglevel_op, /* 1 */
&sysrq_loglevel_op, /* 2 */
&sysrq_loglevel_op, /* 3 */
&sysrq_loglevel_op, /* 4 */
&sysrq_loglevel_op, /* 5 */
&sysrq_loglevel_op, /* 6 */
&sysrq_loglevel_op, /* 7 */
&sysrq_loglevel_op, /* 8 */
&sysrq_loglevel_op, /* 9 */
NULL, /* a 不干活,预留的给sparc*/
&sysrq_reboot_op, /* b 就是reboot咯*/
&sysrq_crash_op, /* c 产生一个crash, 是对一个空指针操作来trigger*/
&sysrq_showlocks_op, /* d 根据是否有CONFIG_LOCKDEP定义输出locks*/
&sysrq_term_op, /* e 这个厉害了,发SIGTERM 给所有的用户进程.*/
&sysrq_moom_op, /* f 调用schedule_work来产生一个OOM execution, 最终是调用了out_of_memory函数,这里面就有点复杂了,下篇再总结这个*/
NULL, /* g 预留给kernel的debug用*/
NULL, /* h 预留给帮助用 */
&sysrq_kill_op, /* i 这个更直接,发SIGKILL给所有的用户进程*/
&sysrq_thaw_op, /* j 通过SysRq来紧急解冻所有的文件系统,前提是有CONFIG_BLOCK内核配置 */
&sysrq_SAK_op, /* k 如果有CONFIG_VT 这个调用schedule_work 来操作SAK_work 就是Secure Attention Key 了吧*/
&sysrq_showallcpus_op, /* l 如果定义了CONFIG_SMP, 就输出所有的CPU的back trace */
&sysrq_showmem_op, /* m 输出内存的信息*/
&sysrq_unrt_op, /* n 这个就给所有RT Tasks 设置NICE*/
NULL, /* o 预留,代表off吧.*/
&sysrq_showregs_op, /* p 输出寄存器的值*/
&sysrq_show_timers_op, /* q 输出时钟事件设备以及等待中的hrtimers*/
&sysrq_unraw_op, /* r 将键盘模式设置为系统默认值*/
&sysrq_sync_op, /* s 做一个临时紧急同步用*/
&sysrq_showstate_op, /* t 调用show_state和show_workqueue_state输出当前系统状态*/
&sysrq_mountro_op, /* u 调用emergency_remount做重新紧急remount*/
NULL, /* v 预留给frame buffer*/
&sysrq_showstate_blocked_op, /* w 输出blocked 的信息*/
NULL, /* x 给不同的体系的dump 预留*/
NULL, /* y 给sparc64预留*/
&sysrq_ftrace_dump_op, /* z 把ftrace中存的信息输出.*/
};

2 主要的执行过程.

2.1 write_sysrq_trigger 调用 __handle_sysrq

2.2 __handle_sysrq 调用 __sysrq_get_key_op(key) 获取操作码.

2.3 __sysrq_get_key_op(key)通过两个for循环, 找到sysrq_key_table对应操作码

2.4 而操作码又有对应的处理函数,然后调用它获取返回值.到此,整个过程也就完成了.