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模式过程详解的更多相关文章

  1. Portlet 通信过程详解

    Portlet 通信过程详解 在 Portal 的开发过程中,Theme 与 portlet 之间的通信,以及 portlet 之间的通信是开发人员常常遇到的问题.通常 Portlet 之间需要能够互 ...

  2. Java多线程编程中Future模式的详解

    Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...

  3. Java多线程编程中Future模式的详解<转>

    Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...

  4. DBA_Oracle Startup / Shutdown启动和关闭过程详解(概念)

    2014-08-07 Created By BaoXinjian

  5. Android的init过程详解(一)

    Android的init过程详解(一) Android的init过程(二):初始化语言(init.rc)解析 本文使用的软件版本 Android:4.2.2 Linux内核:3.1.10 本文及后续几 ...

  6. linux内核剖析(零)linux系统启动过程详解-开机加电后发生了什么

    本文参考了如下文章 深入理解linux启动过程 mbr (主引导记录(Master Boot Record)) 电脑从开机加电到操作系统main函数之前执行的过程 详解linux系统的启动过程及系统初 ...

  7. 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,节点之间局域网连接 ...

  8. BabyLinux制作过程详解

    转:http://www.360doc.com/content/05/0915/14/1429_12641.shtml BabyLinux制作过程详解 作者:GuCuiwen email:win2li ...

  9. (转)Linux 开机引导和启动过程详解

    Linux 开机引导和启动过程详解 编译自:https://opensource.com/article/17/2/linux-boot-and-startup作者: David Both 原创:LC ...

随机推荐

  1. 部署ASP.NET MVC项目

    目标:了解部署过程,掌握部署中出现问题该如何处理. 部署网站往往是一件麻烦事,因为在安装部署的过程中,经常有许多步骤要运行,对于许多不太熟悉IIS/SQL的新手来说,部署网站编程一件非常困难且危险的事 ...

  2. 集合如何判断null

    转http://blog.csdn.net/baple/article/details/8604585 java判断list为空 分类: JAVA 2013-02-23 08:47 18368人阅读 ...

  3. 基于visual Studio2013解决C语言竞赛题之0411公约数和公倍数

       题目 解决代码及点评 求最大公约数和最小公倍数,方法已经在题目中有提示,分析代码实现如下: /* 题目: 输入两个正整数 m和 n,求其最大公约数和最小公倍数. */ #includ ...

  4. bootloader启动代码init.s解析----IRQ中断处理函数

    bootloader启动代码init.s解析----IRQ中断处理函数 init.s源代码如下: ;///////////////////////////////////////////// ;opt ...

  5. BZOJ 1196: [HNOI2006]公路修建问题( MST )

    水题... 容易发现花费最大最小即是求 MST 将每条边拆成一级 , 二级两条 , 然后跑 MST . 跑 MST 时 , 要先加 k 条一级road , 保证满足题意 , 然后再跑普通的 MST . ...

  6. C-最长回文子串(1)

    最长回文子串,就是在字符串中找到最长的对称的子串. s是一个字符串. int max = 0; for(i = 0;i<m;i++) for(j = i;j<m;j++) if(s[i.. ...

  7. Python 绝对简明手册

    Python 绝对简明手册 help(函数名)来获取相关信息 另外,自带的文档和google也是不可少的 2. 基本语法2.1. if / elif / else x=int(raw_input(&q ...

  8. QList 和std::list的比较

    QList QList<T> 是一个Qt通用容器类.它存储一序列的值,并且提供基于索引的数据访问方法和快速的插入和删除操作. QList<T>, QLinkedList< ...

  9. spark论坛

    http://spark.apache.org/ http://bbs.csdn.net/forums/spark http://spark.csdn.net/ http://tieba.baidu. ...

  10. 在vc中使用xtremetoolkit界面库-----安装及环境配置

    近期想用一下xtremetoolkitPro界面库.网上的使用教程资源也不多,当中着实遇到了很多的困难,毕竟是首次使用. 首先当然是配置发开环境了: 我使用的是vc6.0+xtremetoolkitP ...