1. 程式人生 > >linux3.0 核心級除錯工具KDB支援反彙編

linux3.0 核心級除錯工具KDB支援反彙編

      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的補丁中找到,稍候我會將這些檔案上傳一份。

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函式,在這個函式中會根據記憶體中的指令編碼,查詢相應的彙編指令