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. 原生弹窗拖拽代码demo+简单的抽奖

    拖拽效果 效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  2. Linux ldconfig 查看动态库连接

    /usr/lib64/tls: (hwcap: 0x8000000000000000) [root@wx02 ~]# ldconfig -v | grep keep libzookeeper_mt.s ...

  3. 基于visual Studio2013解决算法导论之048红黑树

     题目 红黑树 解决代码及点评 // 红黑树.cpp : 定义控制台应用程序的入口点. // #include <stdio.h> #include <stdlib.h> ...

  4. CMake初步(1)

    转自:<你所不知的OSG>第一章:CMake初步(1)http://bbs.osgchina.org/forum.php?mod=viewthread&tid=1189&f ...

  5. Swift实战-QQ在线音乐(第一版)

    //一.*项目准备 1.QQ音乐App 界面素材:(我使用PP助手,将QQ音乐App备份,解压ipa文件 即可得到里面的图片素材) 2.豆瓣电台接口:"http://douban.fm/j/ ...

  6. 【转】[Mysql] Linux Mysql 日志专题

    原文链接:http://blog.csdn.net/xiaoxu0123/article/details/6258538 1, 设置存放的目录: [root@Linux etc]# more /etc ...

  7. Linux开机启动十步骤

    启动第一步--加载BIOS 启动第二步--读取MBR 启动第三步--Boot Loader 启动第四步--加载内核 启动第五步--用户层init依据inittab文件来设定运行等级 启动第六步--in ...

  8. LVS集群的体系结构

    2.LVS主要组成部分为: 负载调度器(load balancer/ Director),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称 ...

  9. QScriptEngine

    其实你有好多没有介绍 比如qt文字 我一直很迷惑qt的文字的长宽 qt文字的字间距 等等这些东西还有QProcess QProcess可能是qt调用c#的唯一方法了QScript要比你想象的重要,一个 ...

  10. iOS开发中捕获Crash 发送Bug邮件

    在开发过程中,我们有时候会留下Bug,用户在使用我们的app 的时候,有时会出现闪退,这时候我们可以让用户给我们发送邮件,以让我们开发人员更加快速的地位到Bug的所在,以最快的时间解决,同时也提高用户 ...