linux3.0 内核级调试工具KDB支持反汇编

来源:互联网 发布:全能转盘抽奖软件 编辑:程序博客网 时间:2024/06/07 03:39

      KDB是linux内核集成的一个调试工具,关于更多KDB的信息,请查阅相关的信息。本文就是移植kdb的反汇编命令ID。

     在KDB成为内核自身的一部分的时候,关于ID命令就已经被移除,具体的原因不知道。现在的内核虽然支持kdb了,但是并没有这个命令

 ID命令:可以直接对内核的函数进行反汇编,方便对内核死机问题定位。也方面我们了解内核函数的执行过程。

下面是在linux3.0内核中移植ID命令之后的效果:


下面我介绍一下移植的过程:

本文的移植是基于linux3.0内核版本,整体架构是基于MIPS,(kdb还支持x86,powpc,mips等,暂时我只是知道这些)

1、需要的文件

ansidecl.h  bfd.h  dis-asm.h  kdba_id.c  kdb_id.c  mips-dis.c  kdb.h(这个是要放在arch/mips/include/asm下)

在linux内核3.0版本中在kernel/中有dis-asm.h,可以直接进行copy或者调用,

mips-dis.c是KDB反汇编的核心文件,在这个文件中,主要是对mips架构的指令的解析,在内中存储的都是一条32位的指令编码。这个文件就是将内存中指令编码翻译成汇编语言,进而显示出来。

dis-asm.h 是反汇编需要用到的一些数据结构。

ansidecl.h  bfd.h 都是需要的文件,主要功能并没有去研究。

kdb_id.c 是id命令的入口文件,核心的函数kdb_id,这个函数是ID命令的入口

kdba_id.c是基于mips架构的封装文件,主要是一些打印之类的函数。

部分文件可以在KDB的补丁中找到,稍候我会将这些文件上传一份。

http://oss.sgi.com/projects/kdb/  可以找到以前kdb的补丁


http://download.csdn.net/detail/joney526/7530325  kdb资源

2、移植过程

linxu3.0内核关于KDB的存放地点为:

kdb的头文件:

include/linux/kdb.h

arch/mips/include/asm/kdb.h

主要的函数实现在:

kernel/debug/kdb/文件夹下:


  1)首先将这些文件

ansidecl.h  bfd.h  dis-asm.h  kdba_id.c  kdb_id.c  mips-dis.c copy到kernel/debug/kdb/

(你也可以copy到其他地方,但是你需要修改Makefile)我copy到kdb的主要目录处。方面查找和修改

拷贝 kdb.h 到arch/mips/include/asm;(注意在include/linux/也有一个kdb.h,这个文件是linux3.0内核自带的)

2)在kdb中注册id命令。

在/kernel/debug/kdb/kdb_main.c中 

在函数kdb_inittab中添加注册ID命令


由于我在VI下无法用鼠标进行复制,所以这能粘贴一个图片了

3)修改头文件,解决依赖关系

这里就是将各个头文件的引用给修改正确,比如在dis-asm.h中,就引用了<asm/ansidecl.h >而在arch/mips/include/asm中早就不存在这个文件了。不知道是当时删除kdb的时候是否给漏删了,由于现在都放在kdb主目录中,所以直接修改为 include "ansidecl.h"

同理,依次的修改这几个头文件,也可以直接编译 make,根据编译的错误来定位


在kdb中以前用到的文件为 kdbprivate.h现在内核中更改为kdb_private.h,所以部分头文件中(kdb.h)回引用 include "kdbprivate.h" 

修改为 include "kdb_private.h"


4)添加部分函数声明

在kdb_private.h中声明kdb_id.c中调用的函数

 

在make编译的时候,会提示这些的,

5)添加kdb的环境变量(必须要添加,否则id命令无法生效)

在kdb_private.h中


将宏 KDB_PLATFORM_ENV 修改为如上图所示,

IDMODE 是描述为mips指令

IDCOUNT 描述为一次显示的反汇编的行数。如文章开头处显示的id命令一共显示出16行反汇编代码




总结:本文就是简单的说明一下如何移植ID命令,算是给自己一个总结,在移植的过程中,并没有深入的研究其他部分,是指研究了一下怎么将这个函数给反汇编的。


上面的图片是kdb id 命令的一个调用图。最终实现反汇编的是print_insn_mips函数,在这个函数中会根据内存中的指令编码,查找相应的汇编指令

0 0
原创粉丝点击