• 1.简介
SysRq 键可以直接从内核输出信息。只要不是禁止中断状态,即使死机时也可以获取信息。SysRq 键在确认内核运行、调查内核死机原
因等各种情况下都非常有效。
  • 2.需要kernel打开CONFIG_MAGIC_SYSRQ选项支持
  • 3.内核的源代码位置:
drivers/tty/sysrq.c
  • 4.kernel中的实现
static int __init sysrq_init(void)
{
sysrq_init_procfs();        //注册proc入口
if (sysrq_on())   //按键的话需要开关控制
sysrq_register_handler();        //注册按键处理入口
return 0;
}
module_init(sysrq_init);
sysrq proc的支持:
static void sysrq_init_procfs(void)
{
if (!proc_create("sysrq-trigger", S_IWUSR, NULL,
&proc_sysrq_trigger_operations))
pr_err("Failed to register proc interface\n");
}
static const struct file_operations proc_sysrq_trigger_operations = {
.write        = write_sysrq_trigger,
.llseek        = noop_llseek,
};
static ssize_t write_sysrq_trigger(struct file *file, const char __user *buf,
size_t count, loff_t *ppos)
{
if (count) {
char c;
if (get_user(c, buf))
return -EFAULT;
__handle_sysrq(c, false);
}
return count;
}
void __handle_sysrq(int key, bool check_mask)
{
struct sysrq_key_op *op_p;
...
op_p = __sysrq_get_key_op(key);
if (op_p) {
/*
* Should we check for enabled operations (/proc/sysrq-trigger
* should not) and is the invoked operation enabled?
*/
if (!check_mask || sysrq_on_mask(op_p->enable_mask)) {
printk("%s\n", op_p->action_msg);
console_loglevel = orig_log_level;
 op_p->handler(key);
} else {
printk("This sysrq operation is disabled.\n");
}
...
}
struct sysrq_key_op *__sysrq_get_key_op(int key)
{
struct sysrq_key_op *op_p = NULL;
int i;
i = sysrq_key_table_key2index(key);
if (i != -1)
op_p = sysrq_key_table[i];
return op_p;
}
static struct sysrq_key_op *sysrq_key_table[36] = {
&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 & ibm_emac driver debug */
&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 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 */
}
sysrq按键的支持:
首先需要打开开关
打开这个功能,运行:
# echo 1 > /proc/sys/kernel/sysrq
关闭这个功能:
# echo 0 > /proc/sys/kernel/sysrq
#ifdef CONFIG_MAGIC_SYSRQ
{
.procname    = "sysrq",
.data        = &__sysrq_enabled,
.maxlen        = sizeof (int),
.mode        = 0644,
.proc_handler    = sysrq_sysctl_handler,
},
#endif
int sysrq_toggle_support(int enable_mask)
{
bool was_enabled = sysrq_on();
sysrq_enabled = enable_mask;
if (was_enabled != sysrq_on()) {
if (sysrq_on())
 sysrq_register_handler();
else
sysrq_unregister_handler();
}
return 0;
}
由实现可以看出支持动态打开和关闭
注册sysrq按键处理函数:
static inline void sysrq_register_handler(void)
{
int error;
error = input_register_handler(&sysrq_handler);
if (error)
pr_err("Failed to register input handler, error %d", error);
else
sysrq_handler_registered = true;
}
static struct input_handler sysrq_handler = {
.filter        = sysrq_filter,   //哪些消息给sysrq去处理
.connect    = sysrq_connect,
.disconnect    = sysrq_disconnect,
.name        = "sysrq",
.id_table    = sysrq_ids,
};
static bool sysrq_filter(struct input_handle *handle,
unsigned int type, unsigned int code, int value)
{
...
default:
if (sysrq->active && value && value != 2) {
sysrq->need_reinject = false;
__handle_sysrq(sysrq_xlate[code], true);
}
break;
}
....
}
可以看出sysrq按键最终和proc一样都是调用__handle_sysrq()来处理
  • 5.使用实例
sysrq: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-R
查看内存信息:
# echo 'm' > /proc/sysrq-trigger
重启:
# echo 'b' > /proc/sysrq-trigger

Linux中SysRq的使用相关推荐

  1. Linux中SysRq的使用[zt]

    Linux中SysRq的使用Linux中SysRq的使用        作者:blue_stone(blue_stone@xinhuanet.com)        转载请注明出处: http://b ...

  2. linux sysrq使用方法,Linux中SysRq的使用[zt]

    Linux中SysRq的使用[zt] Linux中SysRq的使用Linux中SysRq的使用 作者:blue_stone(blue_stone@xinhuanet.com) 转载请注明出处: htt ...

  3. linux sysrq使用方法,[转载]Linux中SysRq的使用

    在终端上同时按Alt, SysRq和命令键则会执行SysRq命令, SysRq键就是"Print Screen"健. 比如Alt+SysRq+b则重启机器.ALT+SysRQ+X( ...

  4. Linux中/proc目录下文件详解

    Linux中/proc目录下文件详解(一) 声明:可以自由转载本文,但请务必保留本文的完整性. 作者:张子坚 email:zhangzijian@163.com 说明:本文所涉及示例均在fedora ...

  5. linux 中/proc 详解

    proc 文件系统   在Linux中有额外的机制可以为内核和内核模块将信息发送给进程-- /proc 文件系统.最初设计的目的是允许更方便的对进程信息进行访问(因此得名),现在它被每一个有有趣的东西 ...

  6. Linux中/proc目录下文件详解 /proc/devices文件 /proc/modules文件

    http://blog.chinaunix.net/uid-10449864-id-2956854.html 原来对linux系统中的/proc目录不是很了解,只知道可以查看cpu,内存等相关的信息, ...

  7. linux在当前目录下创建pic目录,Linux中/proc目录下文件详解

    文章转自: Linux中/proc目录下文件详解(一) ------------------------------------------------------------------------ ...

  8. Linux中/proc目录下文件详解(zt)

    Linux中/proc目录下文件详解(一) 声明:可以自由转载本文,但请务必保留本文的完整性. 作者:张子坚 email:zhangzijian@163.com 说明:本文所涉及示例均在fedora ...

  9. Linux 中 Swap 分区的概念和使用

    Linux 中 Swap 分区的概念和使用 [root@iZhp3h4x7t41yl0eevhf1dZ ~]# free -h total used free shared buff/cache av ...

最新文章

  1. Linux应用--日志定时清理
  2. 【web前端优化】前端无优化,庸人自扰之!
  3. Java程序员春招三面蚂蚁金服,丹丹丹学妹哭着对我说:学长
  4. Visual Studio 2005 中的新增安全性功能
  5. iOS最好用的弹出框
  6. perl判断变量是数值_Perl学习12之defined undef使用
  7. word2vec损失函数
  8. 厦门大学计算机考研资料汇总
  9. AdGuard4.0新版本广告拦截程序 新增功能介绍
  10. ExcelVBA之某一区域平均值求解
  11. 兄弟连高老师免费收徒
  12. win10下 vim+vimtex 编辑Latex
  13. ANS应用交付助力“武当派招生”
  14. python excel 库 知乎_办公自动化利器openpyxl,高效操作excel的Python库
  15. 乐学python慕课答案_乐学软件工程,中国大学MOOC(慕课)答案公众号搜题
  16. 格物致知-记一次nodejs源码分析的经历
  17. python web 服务器实时监控 websocket_python实现websocket服务器,可以在web实时显示远程服务器日志...
  18. Linux下设备树dts内容(详细)总结及示例解析
  19. #用数组实现把十进制数转化为二进制数
  20. 2023年中国药品零售行业发展前景

热门文章

  1. python小孩的报酬_追索照看孩子的报酬是怎样的
  2. λ演算(lambda演算)原理通俗易懂的详细总结
  3. 为什么Python不适合写游戏?
  4. Vue学习 — vue组件通信
  5. 基于通用优化软件GAMS的数学建模和优化分析实践
  6. UE4中自定义的碰撞几何体使用注意事项
  7. Mybatis -study
  8. 哪里开始是你不曾料想到的去眼袋?
  9. 如何解决Chrome插件安装时出现的“.crx程序包无效”问题
  10. 动态图(三) 动态WebP解码与播放