SlideShare a Scribd company logo
1 of 12
Download to read offline
Intel SDMの
 opcode mapから作る
disassember in kernel
       @mhiramat
自己紹介

     @mhiramat
- まさみさん@がんばらない。
- A Linux kernel hacker.
 - kprobesとかftraceとかperftoolsとかの
  メンテナの一人
- 最近はARMとかOpenFlowとかRubyとか。

でも今日は趣味のx86ディスアセンブラを話します
早速デモ

● /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
背景

● x86のディスアセンブラが作りたくなった
 ○ kprobesのデバッグ→自己書き換えコードの様子が知り
   たい
 ○ 簡単にメモリ上のバイナリをデコードしたい
● 既存のライブラリ
 ○ objdump,distrom...
 ○ どれもこれも、オレオレエンコードばかり
 ○ メンテナンス性、可読性が・・・
   ■ 特にx86は命令追加があるので。
● やっぱりバイブルに頼るしか
 ○ バイブル=Intel SDM
Intel SDM Volume2
● Software Developer's Manual
  ○ x86のバイブル
  ○ Volume2は命令セットのリファレンス
Opcode Map
● Intel Officialなinstructionのエンコード表記
  ○ SDM vol2, Appendix Aに収録
    ■ 例)Eb →ModRMによって表される汎用レジスタあるいはメモリアドレス
      であり、1バイトのサイズ
arch/x86/lib/x86-opcode-map.txt
● Instruction decoderの実装に利用
  ○ バイナリ命令列を解析
    ■ プレフィックス(Legacy,REX,VEX)
    ■ 命令コード(opcode)
    ■ 引数(operands)
            ____
          /__.))ノヽ
          .|ミ.l _  ._ i.)
         (^'ミ/ . ´・ . 〈・ リ   わしが育てた
         .しi   r、_)|
           |  `ニニ' /
          ノ  `ー―i
実装方式

● 命令情報の自動生成
 ○ 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記法の変換<ー逆転とオペランド表記の
       違い
テーブルの例

● オペコード+オペランド
 ○ 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",
実装したもの

● x86命令デコーダ
  ○ x64, AVXにも対応
  ○ Intel形式とAT&T形式の両方対応
  ○ debugfs, kdb, toolsの3つの使い方が可能
● Kconfig
  ○ CONFIG_X86_DISASSEMBLER
    ■ ディスアセンブラ機能を有効にする(debugfs、kdbなど)
  ○ CONFIG_DEBUG_DISASM_ON_OOPS
    ■ Oopsがディスアセンブラ機能を使う
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化・・・?
おわり


俺達の戦いはまだ始まったばかりだ!
(もう1年たっちゃったけど!)

More Related Content

What's hot

デザイナーがTkinterで遊んでみました。
デザイナーがTkinterで遊んでみました。デザイナーがTkinterで遊んでみました。
デザイナーがTkinterで遊んでみました。Chachamaru
 
オープンソース開発と、 あるフレームバッファコンソールの話 ~名古屋応用編~
オープンソース開発と、あるフレームバッファコンソールの話~名古屋応用編~オープンソース開発と、あるフレームバッファコンソールの話~名古屋応用編~
オープンソース開発と、 あるフレームバッファコンソールの話 ~名古屋応用編~nullnilaki
 
core dumpでcode golf
core dumpでcode golfcore dumpでcode golf
core dumpでcode golfNomura Yusuke
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールMITSUNARI Shigeo
 
ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門Hirotaka Kawata
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺MITSUNARI Shigeo
 
FPGAでゲーム機を作ろう! 第6回
FPGAでゲーム機を作ろう! 第6回FPGAでゲーム機を作ろう! 第6回
FPGAでゲーム機を作ろう! 第6回yoshimitsusudoh
 
BLS署名の実装とその応用
BLS署名の実装とその応用BLS署名の実装とその応用
BLS署名の実装とその応用MITSUNARI Shigeo
 
Winodws7のruby2でrails4を遊ぶ環境を作るのだ。
Winodws7のruby2でrails4を遊ぶ環境を作るのだ。Winodws7のruby2でrails4を遊ぶ環境を作るのだ。
Winodws7のruby2でrails4を遊ぶ環境を作るのだ。Yukio Saito
 
Spectre/Meltdownとその派生
Spectre/Meltdownとその派生Spectre/Meltdownとその派生
Spectre/Meltdownとその派生MITSUNARI Shigeo
 
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解MITSUNARI Shigeo
 
あなたの知らないnopたち@ラボユース合宿
あなたの知らないnopたち@ラボユース合宿あなたの知らないnopたち@ラボユース合宿
あなたの知らないnopたち@ラボユース合宿MITSUNARI Shigeo
 
as-1. アセンブラ入門
as-1. アセンブラ入門as-1. アセンブラ入門
as-1. アセンブラ入門kunihikokaneko1
 
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)Shin-ya Koga
 
Trema day 1
Trema day 1Trema day 1
Trema day 1ykuga
 
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenIntel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenMITSUNARI Shigeo
 
Raspberry pi 用 toppers ssp シュリンク版(海賊版)の紹介
Raspberry pi 用 toppers ssp シュリンク版(海賊版)の紹介Raspberry pi 用 toppers ssp シュリンク版(海賊版)の紹介
Raspberry pi 用 toppers ssp シュリンク版(海賊版)の紹介Kazuhiro Takahashi
 

What's hot (20)

デザイナーがTkinterで遊んでみました。
デザイナーがTkinterで遊んでみました。デザイナーがTkinterで遊んでみました。
デザイナーがTkinterで遊んでみました。
 
オープンソース開発と、 あるフレームバッファコンソールの話 ~名古屋応用編~
オープンソース開発と、あるフレームバッファコンソールの話~名古屋応用編~オープンソース開発と、あるフレームバッファコンソールの話~名古屋応用編~
オープンソース開発と、 あるフレームバッファコンソールの話 ~名古屋応用編~
 
core dumpでcode golf
core dumpでcode golfcore dumpでcode golf
core dumpでcode golf
 
Altanative macro
Altanative macroAltanative macro
Altanative macro
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
 
ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
 
FPGAでゲーム機を作ろう! 第6回
FPGAでゲーム機を作ろう! 第6回FPGAでゲーム機を作ろう! 第6回
FPGAでゲーム機を作ろう! 第6回
 
Aio
AioAio
Aio
 
BLS署名の実装とその応用
BLS署名の実装とその応用BLS署名の実装とその応用
BLS署名の実装とその応用
 
Winodws7のruby2でrails4を遊ぶ環境を作るのだ。
Winodws7のruby2でrails4を遊ぶ環境を作るのだ。Winodws7のruby2でrails4を遊ぶ環境を作るのだ。
Winodws7のruby2でrails4を遊ぶ環境を作るのだ。
 
Spectre/Meltdownとその派生
Spectre/Meltdownとその派生Spectre/Meltdownとその派生
Spectre/Meltdownとその派生
 
ゆるバグ
ゆるバグゆるバグ
ゆるバグ
 
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
 
あなたの知らないnopたち@ラボユース合宿
あなたの知らないnopたち@ラボユース合宿あなたの知らないnopたち@ラボユース合宿
あなたの知らないnopたち@ラボユース合宿
 
as-1. アセンブラ入門
as-1. アセンブラ入門as-1. アセンブラ入門
as-1. アセンブラ入門
 
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
 
Trema day 1
Trema day 1Trema day 1
Trema day 1
 
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenIntel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
 
Raspberry pi 用 toppers ssp シュリンク版(海賊版)の紹介
Raspberry pi 用 toppers ssp シュリンク版(海賊版)の紹介Raspberry pi 用 toppers ssp シュリンク版(海賊版)の紹介
Raspberry pi 用 toppers ssp シュリンク版(海賊版)の紹介
 

Similar to Inkernel disasm-from-intelsdm-kernelvm

リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010Tsukasa Oi
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0Kiwamu Okabe
 
セキュアVMの構築 (IntelとAMDの比較、あともうひとつ...) - AVTokyo 2009
セキュアVMの構築 (IntelとAMDの比較、あともうひとつ...) - AVTokyo 2009セキュアVMの構築 (IntelとAMDの比較、あともうひとつ...) - AVTokyo 2009
セキュアVMの構築 (IntelとAMDの比較、あともうひとつ...) - AVTokyo 2009Tsukasa Oi
 
4章 Linuxカーネル - 割り込み・例外 5
4章 Linuxカーネル - 割り込み・例外 54章 Linuxカーネル - 割り込み・例外 5
4章 Linuxカーネル - 割り込み・例外 5mao999
 
【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門sandai
 
Yet another Intel Chipset Internal SMBus device’s driver: ismt(4) (and spdmem...
Yet another Intel Chipset Internal SMBus device’s driver: ismt(4)(and spdmem...Yet another Intel Chipset Internal SMBus device’s driver: ismt(4)(and spdmem...
Yet another Intel Chipset Internal SMBus device’s driver: ismt(4) (and spdmem...Masanobu Saitoh
 
ハリボテなx86エミュレータの作り方 - how to make x86 emulator
ハリボテなx86エミュレータの作り方 - how to make x86 emulatorハリボテなx86エミュレータの作り方 - how to make x86 emulator
ハリボテなx86エミュレータの作り方 - how to make x86 emulatorgunya gunya
 
CCMSI計算科学技術特論A (2015) 第7回 線形代数演算ライブラリBLASとLAPACKの基礎と実践2
CCMSI計算科学技術特論A (2015) 第7回 線形代数演算ライブラリBLASとLAPACKの基礎と実践2CCMSI計算科学技術特論A (2015) 第7回 線形代数演算ライブラリBLASとLAPACKの基礎と実践2
CCMSI計算科学技術特論A (2015) 第7回 線形代数演算ライブラリBLASとLAPACKの基礎と実践2Computational Materials Science Initiative
 
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012Takuro Iizuka
 
TripleOの光と闇
TripleOの光と闇TripleOの光と闇
TripleOの光と闇Manabu Ori
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLakirahiguchi
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
 
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)inaz2
 

Similar to Inkernel disasm-from-intelsdm-kernelvm (20)

PFI Seminar 2010/02/18
PFI Seminar 2010/02/18PFI Seminar 2010/02/18
PFI Seminar 2010/02/18
 
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
 
d-kami x86-1
d-kami x86-1d-kami x86-1
d-kami x86-1
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0
 
セキュアVMの構築 (IntelとAMDの比較、あともうひとつ...) - AVTokyo 2009
セキュアVMの構築 (IntelとAMDの比較、あともうひとつ...) - AVTokyo 2009セキュアVMの構築 (IntelとAMDの比較、あともうひとつ...) - AVTokyo 2009
セキュアVMの構築 (IntelとAMDの比較、あともうひとつ...) - AVTokyo 2009
 
Cpu cache arch
Cpu cache archCpu cache arch
Cpu cache arch
 
4章 Linuxカーネル - 割り込み・例外 5
4章 Linuxカーネル - 割り込み・例外 54章 Linuxカーネル - 割り込み・例外 5
4章 Linuxカーネル - 割り込み・例外 5
 
【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門
 
Yet another Intel Chipset Internal SMBus device’s driver: ismt(4) (and spdmem...
Yet another Intel Chipset Internal SMBus device’s driver: ismt(4)(and spdmem...Yet another Intel Chipset Internal SMBus device’s driver: ismt(4)(and spdmem...
Yet another Intel Chipset Internal SMBus device’s driver: ismt(4) (and spdmem...
 
ハリボテなx86エミュレータの作り方 - how to make x86 emulator
ハリボテなx86エミュレータの作り方 - how to make x86 emulatorハリボテなx86エミュレータの作り方 - how to make x86 emulator
ハリボテなx86エミュレータの作り方 - how to make x86 emulator
 
InfiniBand on Debian
InfiniBand on DebianInfiniBand on Debian
InfiniBand on Debian
 
Boost.SIMD
Boost.SIMDBoost.SIMD
Boost.SIMD
 
CCMSI計算科学技術特論A (2015) 第7回 線形代数演算ライブラリBLASとLAPACKの基礎と実践2
CCMSI計算科学技術特論A (2015) 第7回 線形代数演算ライブラリBLASとLAPACKの基礎と実践2CCMSI計算科学技術特論A (2015) 第7回 線形代数演算ライブラリBLASとLAPACKの基礎と実践2
CCMSI計算科学技術特論A (2015) 第7回 線形代数演算ライブラリBLASとLAPACKの基礎と実践2
 
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012
 
TripleOの光と闇
TripleOの光と闇TripleOの光と闇
TripleOの光と闇
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQL
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
[DL Hacks]FPGA入門
[DL Hacks]FPGA入門[DL Hacks]FPGA入門
[DL Hacks]FPGA入門
 
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
 

More from Masami Hiramatsu

塩漬けシステムに対して個人的に思うこと
塩漬けシステムに対して個人的に思うこと塩漬けシステムに対して個人的に思うこと
塩漬けシステムに対して個人的に思うことMasami Hiramatsu
 
SpectreBustersあるいはLinuxにおけるSpectre対策
SpectreBustersあるいはLinuxにおけるSpectre対策SpectreBustersあるいはLinuxにおけるSpectre対策
SpectreBustersあるいはLinuxにおけるSpectre対策Masami Hiramatsu
 
MINCS - containers in the shell script (Eng. ver.)
MINCS - containers in the shell script (Eng. ver.)MINCS - containers in the shell script (Eng. ver.)
MINCS - containers in the shell script (Eng. ver.)Masami Hiramatsu
 
MINCS – containers in the shell script
MINCS – containers in the shell scriptMINCS – containers in the shell script
MINCS – containers in the shell scriptMasami Hiramatsu
 
Ylug 110th kpatch code reading
Ylug 110th kpatch code readingYlug 110th kpatch code reading
Ylug 110th kpatch code readingMasami Hiramatsu
 

More from Masami Hiramatsu (6)

塩漬けシステムに対して個人的に思うこと
塩漬けシステムに対して個人的に思うこと塩漬けシステムに対して個人的に思うこと
塩漬けシステムに対して個人的に思うこと
 
SpectreBustersあるいはLinuxにおけるSpectre対策
SpectreBustersあるいはLinuxにおけるSpectre対策SpectreBustersあるいはLinuxにおけるSpectre対策
SpectreBustersあるいはLinuxにおけるSpectre対策
 
Mincs 日本語版
Mincs 日本語版Mincs 日本語版
Mincs 日本語版
 
MINCS - containers in the shell script (Eng. ver.)
MINCS - containers in the shell script (Eng. ver.)MINCS - containers in the shell script (Eng. ver.)
MINCS - containers in the shell script (Eng. ver.)
 
MINCS – containers in the shell script
MINCS – containers in the shell scriptMINCS – containers in the shell script
MINCS – containers in the shell script
 
Ylug 110th kpatch code reading
Ylug 110th kpatch code readingYlug 110th kpatch code reading
Ylug 110th kpatch code reading
 

Inkernel disasm-from-intelsdm-kernelvm

  • 1. Intel SDMの opcode mapから作る disassember in kernel @mhiramat
  • 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
  • 5. Intel SDM Volume2 ● Software Developer's Manual ○ x86のバイブル ○ Volume2は命令セットのリファレンス
  • 6. Opcode Map ● Intel Officialなinstructionのエンコード表記 ○ SDM vol2, Appendix Aに収録 ■ 例)Eb →ModRMによって表される汎用レジスタあるいはメモリアドレス であり、1バイトのサイズ
  • 7. arch/x86/lib/x86-opcode-map.txt ● Instruction decoderの実装に利用 ○ バイナリ命令列を解析 ■ プレフィックス(Legacy,REX,VEX) ■ 命令コード(opcode) ■ 引数(operands)      ____    /__.))ノヽ    .|ミ.l _  ._ i.)   (^'ミ/ . ´・ . 〈・ リ   わしが育てた   .しi   r、_)|     |  `ニニ' /    ノ  `ー―i
  • 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化・・・?