linux内核调试之魔术键sysrq

发布时间:2024年01月11日

linux内核调试之魔术键sysrq

1 sysrq简介

sysrq是内核提供的一组魔数组合键,通过该组合键可以直接触发内核的特定功能,如重启系统,设置loglevel等。在内核发生故障时,只要键盘还有响应就可以使用它们触发相应操作。

除了通过键盘触发以外,内核还支持通过proc文件系统触发sysrq操作。该方式为每种操作定义了一个唯一的字符,当需要触发操作时,只需将对应的字符写到/proc/sysrq-trigger文件即可。如以下命令可用于重启系统:

echo b > /proc/sysrq-trigger

在嵌入式系统中一般不含有键盘,因此后面我们的介绍将以proc方式为主

2 sysrq实现

2.1 内核配置

若要使能sysrq功能,需要设置内核的如下配置选项:

CONFIG_MAGIC_SYSRQ=y

2.2 sysrq初始化流程

sysrq初始化的主要工作包括为其创建proc文件,以支持proc方式触发sysrq命令。以及将其注册到input子系统中,以支持通过按键方式触发sysrq命令。其相应的流程如下:

在这里插入图片描述

其中procfs支持的操作函数如下:

static const struct proc_ops sysrq_trigger_proc_ops = {
  .proc_write= write_sysrq_trigger,
  .proc_lseek= noop_llseek,
}

在该ops操作函数中,write_sysrq_trigger用于解析用户输入的proc命令,并根据解析值执行相应的处理函数。

3 sysrq支持的常用命令

/kernel/drivers/tty/sysrq.c

static const struct sysrq_key_op *sysrq_key_table[62] = {
 &sysrq_loglevel_op,  /* 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 */

 /*
  * a: Don't use for system provided sysrqs, it is handled specially on
  * sparc and will never arrive.
  */
 NULL,    /* a */
 &sysrq_reboot_op,  /* b */
 &sysrq_crash_op,  /* c */
 &sysrq_showlocks_op,  /* d */
 &sysrq_term_op,   /* e */
 &sysrq_moom_op,   /* f */
 /* g: May be registered for the kernel debugger */
 NULL,    /* g */
 NULL,    /* h - reserved for help */
 &sysrq_kill_op,   /* i */
#ifdef CONFIG_BLOCK
 &sysrq_thaw_op,   /* j */
#else
 NULL,    /* j */
#endif
 &sysrq_SAK_op,   /* k */
#ifdef CONFIG_SMP
 &sysrq_showallcpus_op,  /* l */
#else
 NULL,    /* l */
#endif
 &sysrq_showmem_op,  /* m */
 &sysrq_unrt_op,   /* n */
 /* o: This will often be registered as 'Off' at init time */
 NULL,    /* o */
 &sysrq_showregs_op,  /* p */
 &sysrq_show_timers_op,  /* q */
 &sysrq_unraw_op,  /* r */
 &sysrq_sync_op,   /* s */
 &sysrq_showstate_op,  /* t */
 &sysrq_mountro_op,  /* u */
 /* v: May be registered for frame buffer console restore */
 NULL,    /* v */
 &sysrq_showstate_blocked_op, /* w */
 /* x: May be registered on mips for TLB dump */
 /* x: May be registered on ppc/powerpc for xmon */
 /* x: May be registered on sparc64 for global PMU dump */
 NULL,    /* x */
 /* y: May be registered on sparc64 for global register dump */
 NULL,    /* y */
 &sysrq_ftrace_dump_op,  /* z */
 NULL,    /* A */
 NULL,    /* B */
 NULL,    /* C */
 NULL,    /* D */
 NULL,    /* E */
 NULL,    /* F */
 NULL,    /* G */
 NULL,    /* H */
 NULL,    /* I */
 NULL,    /* J */
 NULL,    /* K */
 NULL,    /* L */
 NULL,    /* M */
 NULL,    /* N */
 NULL,    /* O */
 NULL,    /* P */
 NULL,    /* Q */
 NULL,    /* R */
 NULL,    /* S */
 NULL,    /* T */
 NULL,    /* U */
 NULL,    /* V */
 NULL,    /* W */
 NULL,    /* X */
 NULL,    /* Y */
 NULL,    /* Z */
}

OOM的内存状态信息

echo m > /proc/sysrq-trigger

将当前内存信息 dump 到终端

3.1sysrq支持的常用命令

(1)0 – 9:用于设置控制台的loglevel,其中数字的值表示将要设置的loglevel等级

(2)b:重启系统

(3)c:手动触发panic

(4)d:显示所有进程持有的锁,该命令需要支持lockdep才有效

(5)e:结束所有用户进程

(6)f:手动触发oom流程

(7)i:杀死所有用户线程

(8)j:冻结所有文件系统

(9)l:显示所有cpu的调用栈

(10)m:显示系统的内存信息

(11)n:将所有用户实时进程修改为普通进程

(12)p:若cpu处于中断状态,则显示当前cpu的寄存器

(13)q:显示所有的timer

(14)s:执行文件系统的同步操作(sync)

(15)t:显示所有进程的执行状态,如其执行状态、pid、ppi以及调用栈等

(16)u:对所有文件系统执行remount操作

(17)w:显示所有当前为TASK_UNINTERRUPTIBLE进程的执行状态

(18)z:dump所有ftrace的buffer

imer

(14)s:执行文件系统的同步操作(sync)

(15)t:显示所有进程的执行状态,如其执行状态、pid、ppi以及调用栈等

(16)u:对所有文件系统执行remount操作

(17)w:显示所有当前为TASK_UNINTERRUPTIBLE进程的执行状态

(18)z:dump所有ftrace的buffer


文章来源:https://blog.csdn.net/xushx_bigbear/article/details/135531293
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。