自作ISSに、GDBのインタフェースを追加したので、これを使ってxv6のデバッグを行いたい。何となくMIPSの移植は出来ているので、プロセスの切り替えとか、GDBで観察できれば、よりデバッグが容易になると思うんだ。
xv6のコードは、どなたかがMIPSに移植してもらっているものを利用する。
https://github.com/msyksphinz/xv6-mips/tree/feature/process_debuggithub.com
参考にしたサイト
http://zoo.cs.yale.edu/classes/cs422/2010/lec/l2-hw
xv6のデバッグ環境をつくる #kernel - Qiita
ISSとGDBを接続してxv6をデバッグする環境を構築する
ISSを立ち上げ、リモート接続待ちモードに入る
まずは、MIPS32ビット版のISSを立ち上げて、待合せ状態に入るようにする。 このときに、ISS側ではとりあえずxv6のイメージファイルをロードしている。
$ make iss-nox-gdb *** Now run 'gdb'. swimmer_mips -gdb 2000 --imgfile xv6.img --init_pc 0x1fc00000 --debug Swimmer-RISCV Version 20160130 Revision 1c40804 developed by <> <Load Image xv6.img> <Info: NewMemory Region 1fc00000 is defined.> Listening for RSP on port 2000
このとき、PCの初期値はxv6のイメージのリセットベクタの場所、0x1fc0_0000に設定する。
GDBとの接続
シンボルとソースをロードし、gdbを立ち上げる。
mips-img-elf-gdb kernel GNU gdb (Codescape GNU Tools 2015.06-05 for MIPS IMG Bare Metal) 7.9.1 Copyright (C) 2015 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "--host=x86_64-unknown-linux-gnu --target=mips-img-elf". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://imgtec.com/mips-sdk-support/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from kernel...done. (gdb)
ターゲットと接続し、PCの初期値を確認し、ソースを取り込む。
target remote :2000 symbol-file kernel source .
ここまでで、ISSといくつかパケッと交換が発生している(実はここまででずいぶんとISSのバグを踏んだんだけれども...)
Packet : qSupported:multiprocess+;qRelocInsn+ Packet : Hg0 Packet : qTStatus Packet : ? Packet : qfThreadInfo Packet : qL1200000000000000000 Packet : Hc-1 Packet : qC Packet : qAttached Packet : qOffsets Packet : Hg0 Packet : g Packet : g Packet : p20 Packet : g Packet : p25 PC = 1fc00000 Packet : qL1200000000000000000 Packet : m1fc00000,4 Packet : qSymbol:: Packet : m1fc00000,4
ブレークポイントを設定する
execに到達したときにブレークするようにしたいので、
(gdb) b exec Breakpoint 1 at 0x8010143c: file exec.c, line 21.
ISS側はどうなっているかと言うと、
Packet : m80101438,4 <Warning: Memory Region 80101438 is not defined.> <Warning: Memory Region 80101439 is not defined.> <Warning: Memory Region 8010143a is not defined.> <Warning: Memory Region 8010143b is not defined.> Packet : m80101438,4 <Warning: Memory Region 80101438 is not defined.> <Warning: Memory Region 80101439 is not defined.> <Warning: Memory Region 8010143a is not defined.> <Warning: Memory Region 8010143b is not defined.> Packet : m8010143c,4 <Warning: Memory Region 8010143c is not defined.> <Warning: Memory Region 8010143d is not defined.> <Warning: Memory Region 8010143e is not defined.> <Warning: Memory Region 8010143f is not defined.>
あ、パケットは来ているが、どうもアドレス領域が違うらしく、ISS側で認識できていない。なんでだ? とりあえず、xv6のイメージをロードする環境は出来てきた。もうちょっと修正して、あとは無限にシミュレータを実行できる環境を構築しないと...