xv6-riscv 第1章のまとめ

MITで行われているxv6について授業の資料が公開されていたので、先々週くらいからチャンレンジしています。 4章くらいまで終わったので、まずは1章を軽くまとめてみます。

はじめに

xv6とは

近代UNIX系OSの元となったUnix v6を移植したものです。

Unix v6とは

  • エッセンスは現在のOSにも通づるものがある
  • 約1万行程度とOSにしては少ない分量で書かれているのでOSの全体像を学習するのにとても役立つ
  • ただし、古いC言語PDP-11という古いマシン(CPU? プロセッサ?)用に記述されているので読みづらい部分がある

という特徴があります

xv6は

  • C言語はC99以降のものなり、またriscvで動作するようになっているので、2020年度の我々にも読みやすいものとなっている
  • 教育用なのでコードや注釈もわかりやすいものになっている
  • 講義の資料や課題とかまでついている

となっており、OSの全体像を把握したい人にはうってつけのものになっています。

ドキュメントなど

このページの上にあるxv6というタブからソースコードと資料(pdf)をダウンロードできます。 また、各授業ごとに課題もついております。 https://pdos.csail.mit.edu/6.S081/2020/schedule.html

私は英語が得意ではないので、この日本語にしてくれた方の資料を読みつつ、気になるところがあれば英語の資料にあたる方法をとっています。 https://www.sugawara-lab.jp/lecture.html

進め方としては

  1. その章の資料を読む
  2. 課題を読んで、実際のソースコードを改良して機能追加をする
  3. 付属してあるテストコードを実行してテストが通るまで改良を続ける
  4. 次の章を読む

といったサイクルを繰り返します

課題は半日以上かかる歯ごたえがあり、点数とかも表示されるのでゲーム感覚で楽しめてます。 脱線になりますが、私は勉強するときは手を動かしたいタイプで、また独学だと課題に正解しているかわからないことが多いので、今回のようなテストコードが付属してある形式はとても好みです。

本章

本文のまとめとかはよくあると思うので、課題のほうを中心にまとめてみます。 githubのコードもあげています。ただ、C言語が詳しくなくテストに通っているだけで模範解答では全く無いと思います。

各課題の難易度は、Easyだと1時間未満、Moderateは1 ~ 2時間、Hardはそれ以上かかる見込みだそうです

https://pdos.csail.mit.edu/6.S081/2020/labs/guidance.html

第1章 Xv6 and Unix utilities

github.com

Boot xv6 (easy)

xv6を起動する課題。

OSごとに手順がまとまっており、特につまるところはありませんでした。 https://pdos.csail.mit.edu/6.S081/2020/tools.html

sleep (easy)

実装済みのシステムコール sleep をコマンドラインから呼び出してみようという課題。

おそらく課題の意図としては、ディレクトリ構造やシステムコールの呼び出し方を把握するだけのもので特に難しいことはなかったです。 誘導もとても丁寧でした。

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

pingpong (easy)

forkとpipeを駆使して、子プロセスでping、親プロセスでpongと出力しようという課題。

割とよくある課題で本文中にもforkやpipeの解説があったため、割と簡単でした。

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

primes (moderate)/(hard)

ハードなのでスキップしてます。

find (moderate)

簡易版findコマンドを作ろうという課題。

これは仕様の勘違いで時間がかかりました。
find a b は、aディレクトリとbディレクトリから再帰的にファイルを検索するものかと思ってました。
実際には./a/b/*以下を再帰的に検索するもので、カレントディレクトリを起点に、bディレクトリから再帰的にファイルを検索するものだったそうです。

その他には、文字列にstrcmpを使わなければいけないなど、C言語っぽいところで詰まったことが多かったです。

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

xargs (moderate)

簡易版xargsコマンドを作ろうという課題。

実装してみて、なるほどこんな簡単な仕組みで動いていたのかという印象を受けました。 xargsは結構すんなり作ることができましたが、前課題のfindに依存しておりそっちが壊れていたのに気づかず、時間がかかってしまいました。

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