More Related Content
Similar to Inkernel disasm-from-intelsdm-kernelvm
Similar to Inkernel disasm-from-intelsdm-kernelvm (20)
More from Masami Hiramatsu
More from Masami Hiramatsu (6)
Inkernel disasm-from-intelsdm-kernelvm
- 2. 自己紹介
@mhiramat
- まさみさん@がんばらない。
- A Linux kernel hacker.
- kprobesとかftraceとかperftoolsとかの
メンテナの一人
- 最近はARMとかOpenFlowとかRubyとか。
でも今日は趣味のx86ディスアセンブラを話します
- 3. 早速デモ
● /sys/kernel/debug/x86/disassemble
○ echoでアドレスとか関数名書き込む
○ catで読み出し
● tools/disasm/ldisasm
○ AT&T/Intel, 32/64bit切り替え
● kernel panic
○ Before
■ BUG-> stackdump + code
○ After (oops=disasm)
■ BUG-> stackdump + asm code
- 4. 背景
● x86のディスアセンブラが作りたくなった
○ kprobesのデバッグ→自己書き換えコードの様子が知り
たい
○ 簡単にメモリ上のバイナリをデコードしたい
● 既存のライブラリ
○ objdump,distrom...
○ どれもこれも、オレオレエンコードばかり
○ メンテナンス性、可読性が・・・
■ 特にx86は命令追加があるので。
● やっぱりバイブルに頼るしか
○ バイブル=Intel SDM
- 6. Opcode Map
● Intel Officialなinstructionのエンコード表記
○ SDM vol2, Appendix Aに収録
■ 例)Eb →ModRMによって表される汎用レジスタあるいはメモリアドレス
であり、1バイトのサイズ
- 8. 実装方式
● 命令情報の自動生成
○ opcode-map.txt を awk で処理
○ inat-table, mnemonicsのデコード・可視化用テーブル
を動的に生成
■ メンテナンスはopcode-map.txtが中心
■ 可視化用テーブルは基本的にopcode mapそのもの
● デコード+可視化
○ arch/x86/lib/disasm.c
○ instruction decoder -> asm formatting
○ 難しいのはoperandの解析だけ
■ ややこしいアドレッシングモードの処理など
■ Intel/AT&T記法の変換<ー逆転とオペランド表記の
違い
- 9. テーブルの例
● オペコード+オペランド
○ Opecode Mapのエンコードをほぼそのまま利用
■ Well documented by Intel :)
■ 小文字で始まるのは固定レジスタ
■ _で始まるのはレジスタだが、サイズは変化(size_prefix依存)
/* Table: one byte opcode */
const char *mnemonic_primary_table
[INAT_OPCODE_TABLE_SIZE] = {
[0x00] = "add Gb,Eb",
[0x01] = "add Gv,Ev",
[0x02] = "add Eb,Gb",
[0x03] = "add Ev,Gv",
[0x04] = "add IB,al",
[0x05] = "add Iz,_rax",
[0x06] = "push es",
[0x07] = "pop es",
- 10. 実装したもの
● x86命令デコーダ
○ x64, AVXにも対応
○ Intel形式とAT&T形式の両方対応
○ debugfs, kdb, toolsの3つの使い方が可能
● Kconfig
○ CONFIG_X86_DISASSEMBLER
■ ディスアセンブラ機能を有効にする(debugfs、kdbなど)
○ CONFIG_DEBUG_DISASM_ON_OOPS
■ Oopsがディスアセンブラ機能を使う
- 11. Source Code
● 2012/4/1(JSTでは4/2)にLKMLに投下
○ Joke patchだと思われる
○ 色々コメントが付き修正するものの、時間も尽き...
○ そして1年の月日が流れた。
● GitHub上で公開
○ 先週末最新版を公開(-tipツリーベース)
○ https://github.com/mhiramat/linux/tree/inkernel-
disasm-20130407
○ はからずもポータブルであることを証明(ぉぃ
● TODO
○ Intel SDMの最新版に対応してない(Haswellとか?)
○ Upstream化・・・?