FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

ISSとGDBを接続してxv6をデバッグする環境を構築する

自作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のイメージをロードする環境は出来てきた。もうちょっと修正して、あとは無限にシミュレータを実行できる環境を構築しないと...

過去の記事

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com