xv6-riscv 第2, 4章のまとめ

xv6の課題の続きで、今回は2章と4章をまとめます (3章の課題難しくてスキップしている)  

第2章 system calls

github.com

課題

System call tracing (moderate)

システムコールを呼ばれるたびにログに吐き出すシステムコールを作る課題

課題の意図は、システムコールの追加方法を学ぼうというものっぽいので、誘導にそってやれば特に難しいことはなかったです。

解くのにかかった時間: 1時間

Sysinfo (moderate)

残メモリと使用中のプロセス数を取得するシステムコールを作る課題

こちらも誘導が丁寧なので上からやっていけば簡単に終わりました。 強いて言えばkernelからuserにsysinfoの情報を渡すときに、copyoutを使わなければ行けないのが少々トリッキーなくらいでした。

解くのにかかった時間: 1時間

第4章 Traps and system calls

この3章、4章あたりから課題が急に難しくなってきた感じです。

github.com

課題

RISC-V assembly (easy)

RISC-Vのアセンブラを学ぼうという課題で、読めば終わるものでした

解くのにかかった時間: 20分

Backtrace (moderate)

backtrace関数を作ろうという課題。

stack frameとtrap frameを混同しておりめっちゃ時間がかかりました。 この課題で必要なのはstack frameでそれっぽいことは別紙に書いてあります。 https://pdos.csail.mit.edu/6.828/2020/lec/l-riscv-slides.pdf

stack frameの構造さえわかってしまえば、空になるまでframeを戻っていく簡単な課題でした。

上記の誤解を気づけたのは、gdbのbacktraceコマンドで今回の正解が表示させてみたり、 frame infoコマンドと私が書いたコードの差分をとってみたり、結構泥臭いことやってました。

解くのにかかった時間: 6時間

Alarm (hard)

この課題では、テストコードで割り込み上限回数とコールバック関数が与えられます。
そして、テストコードが断続的にタイマー割り込みを発生させるので、割り込みの回数を記憶しておき割り込み上限回数まで達したらコールバックを呼び出すという課題です。

割り込み時、どうやってコールバック関数を呼び出すかが難問でした。
正直わからなかったので先人たちの知恵を借りたところ、epcを直接書き換えれば良いということがわかり、目からウロコでした。
同時に、このままwebエンジニアとして生きていたら、一生仕事でこのコード書くことないんだろうなと思いました。

解くのにかかった時間: 3時間