GDB スタブを書いてみよう その2
gdb 7.0 をダウンロードする。
./gdb/m68k-stub.c ./gdb/m32r-stub.c ./gdb/i386-stub.c ./gdb/sparc-stub.c
前回の調査で sparc-stub.c が良くまとまっている事が分かっているので見ていこう。
さっそく GDB コマンドなる物があるらしく説明がある。レジスタやメモリの read/write、resume, stop, kill など。
* command function Return value * * g return the value of the CPU registers hex data or ENN * G set the value of the CPU registers OK or ENN * * mAA..AA,LLLL Read LLLL bytes at address AA..AA hex data or ENN * MAA..AA,LLLL: Write LLLL bytes at address AA.AA OK or ENN * * c Resume at current address SNN ( signal NN) * cAA..AA Continue at address AA..AA SNN * * s Step one instruction SNN * sAA..AA Step one instruction from AA..AA SNN * * k kill * * ? What was the last sigval ? SNN (signal NN)
- コマンドの直後に checksum が置かれる
- コマンド作成と parse はそのまま流用できそう
- GDB が理解するのは SIGILL などのシグナル
- stub が sparc の trap 種別との変換表を保持している
handle_exception
handle_exception が本丸のようだ。sparc のアセンブリは分からないので適当に追う。
- 動作
- まずホストから情報送信
- 次にリモートの GDB から1つコマンドが送られてくるので応じる
- ホスト側からの情報送信
- exception が起きた事とその種類。
- pc
- fp (多分フレームポインタ)
- sp
- コマンド
- exception が起きたら host にまず知らせる(パケット送信)
sparc の stub は予想より短かった。
保留事項
次の一手
具体的な OS 上で動いている stub を見る事とする。良いサンプルを見つけよう。