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