VirtualBox上で動かすのは手間がかかるので、WSL上でxv6を動かします。
IDEを使ってソースの参照やデバッグができると便利なので、
Visual Studio Codeでソースを参照、ビルド、デバッグをできるようにします。
ホストOS:Windows 10 Pro
ゲストOS:Ubuntu 18.04.3 LTS (Bionic Beaver)
IDE:Visual Studio Code 1.40.1
プラグイン:Remote - WSL, C/C++, Japanese Language Pack for VS Code
ソースを置くディレクトリ:D:\develop\vscode\xv6
(1)環境準備
$ sudo apt-get update
$ sudo apt-get install build-essential
$ sudo apt-get install gcc-multilib
$ sudo apt-get install qemu
$ sudo apt-get install git
(2)ソースをダウンロード&コンパイル
$ cd /mnt/d/develop/vscode/xv6/
$ git clone git://github.com/mit-pdos/xv6-public.git
$ cd xv6-public/
$ make
$ make qemu-nox
⇒起動することを確認する。
カレントディレクトリをプロジェクトとして開いて起動する。
$ code .
⇒Visual Studio Codeが起動する。
.vscode\tasks.jsonファイルを作り、下記の内容を記述する。
----------------------------------------------------------------
{
"version": "2.0.0",
"type":"shell",
"echoCommand": true,
"tasks": [
{
"label": "xv6 build",
"command": "make",
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "xv6 clean",
"command": "make clean",
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "xv6 run qemu-nox-gdb",
"command": "make qemu-nox-gdb",
"problemMatcher": [
"$tsc"
],
}
]
}
----------------------------------------------------------------
メニューで、「ターミナル」→「ビルドタスクの実行...」を選択する。
「実行するビルドタスクを選択」で、「xv6 clean」を選択する。
「実行するビルドタスクを選択」で、「xv6 build」を選択する。
→ビルドが正常に完了することを確認する。
.vscode\launch.jsonファイルを作り、下記の内容を記述する。
----------------------------------------------------------------
{
"version": "0.2.0",
"configurations": [
{
"name": "xv6 debug",
"type": "cppdbg",
"request": "launch",
"program": "/mnt/d/develop/vscode/xv6/xv6-public/kernel",
"miDebuggerServerAddress": "localhost:26000",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "dir .",
"ignoreFailures": true
}
]
}
]
}
----------------------------------------------------------------
元のファイルをバックアップする。
$ cp .gdbinit.tmpl -p .gdbinit.tmpl_org
テンプレートファイルを開き、リモートデバッグ部分を消す。
$ vi .gdbinit.tmpl
23行目、24行目の下記の記述を消して保存する。
----------------------------------------------------------------
echo + target remote localhost:1234\n
target remote localhost:1234
----------------------------------------------------------------
①xv6を起動
メニューで、「ターミナル」→「タスクの実行」を選択する。
「実行するタスクを選択」で、「xv6 run qemu-nox-gdb」を選択する。
→下記の表示となり、デバッガの接続待ちとなる。
---------------------------------------------------------------
*** Now run 'gdb'.
qemu-system-i386 -nographic -drive file=fs.img,index=1,media=disk,format=raw -drive file=xv6.img,index=0,media=disk,format=raw -smp 2 -m 512 -S -gdb tcp::26000
---------------------------------------------------------------
②デバッガで接続
デバッグで「xv6 debug」を選択し、デバッガを実行する。
→接続が完了すると、ターミナルにxv6のプロンプトが表示される。
exec.c の 22行目にブレークポイントを指定して実行した画面です。
プロセスへのアタッチが制限されている場合は下記のコマンドで一時的に解除する。
$ echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope