System Request 进入KDB模式过程详解
0
echo g > /proc/sysrq-trigger
怎么让系统停下来,进入进入KDB循环?
1
需要简单了解下:Linux Magic System Request
2
在sysrq数组中我并没有发现注册”g”对应调用的函数,可是调试的时候确实生效了
static struct sysrq_key_op *sysrq_key_table[36] = {
&sysrq_loglevel_op, /* 0 */
&sysrq_loglevel_op, /* 1 */
&sysrq_loglevel_op, /* 2 */
……
&sysrq_term_op, /* e */
&sysrq_moom_op, /* f */
/* g: May be registered for the kernel debugger */
NULL, /* g */
NULL, /* h – reserved for help */
……
}
这里的时候为空,不知道在哪里绑定的
头脑转不过弯,在内核中查找 sysrq_key_table数组(一般来说不会直接操作数据结构),结果没有发现有注册
其实直接搜索register_sysrq_key就可以(这个后来才知道的)
3
最后用了最笨的方法:
3.1 driver/char/sysrq.c __handle_sysrq函数中添加打印函数地址
void __handle_sysrq(int key, struct tty_struct *tty, int check_mask)
{
op_p = __sysrq_get_key_op(key);
//此行为添加的
printk(KERN_ERR”key is %d op_p func pointer is %p , %d:\n”,key,op_p->handler,op_p->handler);
}
运行时输出:
[ 184.269194] key is 103 op_p func pointer is c00c8238 , -1072922056:
3.2 objdump -s vmlinux > linux
或者在System.map中查找
3.3 以下是查找对应的结果:
c00c8238 t sysrq_handle_dbg
4
static struct sysrq_key_op sysrq_dbg_op = {
.handler = sysrq_handle_dbg,
.help_msg = “debug(G)”,
.action_msg = “DEBUG”,
};
//模块加载的时候,就注册到SYSRQ数组里面去了
#ifdef CONFIG_MAGIC_SYSRQ
register_sysrq_key(‘g’, &sysrq_dbg_op);
#endif
5
echo g > /proc/sysrq-trigger
—sysrq_handle_dbg
—> arch_kgdb_breakpoint
static inline void arch_kgdb_breakpoint(void)
{
//这个会触发一个trap:软中断,arm与X86的实现有些不一样
//x86是直接插入0XCC(int 3),arm则是发现没有这个指令触发一个trap
asm(“.word 0xe7ffdeff”);
}
6
之后进入trap处理函数中
kgdb_handle_exception
—>kdb_stub
—>kdb_main_loop
—>kdb_local
在kdb_local循环中接收用户输入的命令(go , bp , rd 等)
System Request 进入KDB模式过程详解的更多相关文章
- Portlet 通信过程详解
Portlet 通信过程详解 在 Portal 的开发过程中,Theme 与 portlet 之间的通信,以及 portlet 之间的通信是开发人员常常遇到的问题.通常 Portlet 之间需要能够互 ...
- Java多线程编程中Future模式的详解
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- Java多线程编程中Future模式的详解<转>
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- DBA_Oracle Startup / Shutdown启动和关闭过程详解(概念)
2014-08-07 Created By BaoXinjian
- Android的init过程详解(一)
Android的init过程详解(一) Android的init过程(二):初始化语言(init.rc)解析 本文使用的软件版本 Android:4.2.2 Linux内核:3.1.10 本文及后续几 ...
- linux内核剖析(零)linux系统启动过程详解-开机加电后发生了什么
本文参考了如下文章 深入理解linux启动过程 mbr (主引导记录(Master Boot Record)) 电脑从开机加电到操作系统main函数之前执行的过程 详解linux系统的启动过程及系统初 ...
- hadoop1.2.1+zk-3.4.5+hbase-0.94.1集群安装过程详解
hadoop1.2.1+zk-3.4.5+hbase-0.94.1集群安装过程详解 一,环境: 1,主机规划: 集群中包括3个节点:hadoop01为Master,其余为Salve,节点之间局域网连接 ...
- BabyLinux制作过程详解
转:http://www.360doc.com/content/05/0915/14/1429_12641.shtml BabyLinux制作过程详解 作者:GuCuiwen email:win2li ...
- (转)Linux 开机引导和启动过程详解
Linux 开机引导和启动过程详解 编译自:https://opensource.com/article/17/2/linux-boot-and-startup作者: David Both 原创:LC ...
随机推荐
- 部署ASP.NET MVC项目
目标:了解部署过程,掌握部署中出现问题该如何处理. 部署网站往往是一件麻烦事,因为在安装部署的过程中,经常有许多步骤要运行,对于许多不太熟悉IIS/SQL的新手来说,部署网站编程一件非常困难且危险的事 ...
- 集合如何判断null
转http://blog.csdn.net/baple/article/details/8604585 java判断list为空 分类: JAVA 2013-02-23 08:47 18368人阅读 ...
- 基于visual Studio2013解决C语言竞赛题之0411公约数和公倍数
题目 解决代码及点评 求最大公约数和最小公倍数,方法已经在题目中有提示,分析代码实现如下: /* 题目: 输入两个正整数 m和 n,求其最大公约数和最小公倍数. */ #includ ...
- bootloader启动代码init.s解析----IRQ中断处理函数
bootloader启动代码init.s解析----IRQ中断处理函数 init.s源代码如下: ;///////////////////////////////////////////// ;opt ...
- BZOJ 1196: [HNOI2006]公路修建问题( MST )
水题... 容易发现花费最大最小即是求 MST 将每条边拆成一级 , 二级两条 , 然后跑 MST . 跑 MST 时 , 要先加 k 条一级road , 保证满足题意 , 然后再跑普通的 MST . ...
- C-最长回文子串(1)
最长回文子串,就是在字符串中找到最长的对称的子串. s是一个字符串. int max = 0; for(i = 0;i<m;i++) for(j = i;j<m;j++) if(s[i.. ...
- Python 绝对简明手册
Python 绝对简明手册 help(函数名)来获取相关信息 另外,自带的文档和google也是不可少的 2. 基本语法2.1. if / elif / else x=int(raw_input(&q ...
- QList 和std::list的比较
QList QList<T> 是一个Qt通用容器类.它存储一序列的值,并且提供基于索引的数据访问方法和快速的插入和删除操作. QList<T>, QLinkedList< ...
- spark论坛
http://spark.apache.org/ http://bbs.csdn.net/forums/spark http://spark.csdn.net/ http://tieba.baidu. ...
- 在vc中使用xtremetoolkit界面库-----安装及环境配置
近期想用一下xtremetoolkitPro界面库.网上的使用教程资源也不多,当中着实遇到了很多的困难,毕竟是首次使用. 首先当然是配置发开环境了: 我使用的是vc6.0+xtremetoolkitP ...