はじめに
xv6はMITが開発している現代版Unix V6です。 x86アーキテクチャで動作するようになっています。 お手元のPCで簡単に動作させれます。
本記事ではその詳細についてMITが公開している。 xv6, a simple, Unix-like teaching operating system(以下 commentary/textbook) を元にソースコードレベルで解説していきます。 そのため、基本的にはcommentary/textbookに書いてあることを 要約したり説明を付け足したりした記事になります。
筆者もOS初心者であり、OS入門するために半年前位1からxv6のコードリーディングを始めました。 しかし、初心者には難しい面もありました。 本記事は筆者がxv6のコードリーディングを始めた時にこういう解説記事があったらうれしかったなという思いで本記事を書いています。 今からxv6のコードリーディングを始める人の助けになればと思います。
間違った解説をしている可能性も十分にあるためその際は指摘した頂けると幸いです。 また、筆者はLinux等の実際のOSに詳しいわけではありません。 Linuxだとこんな風にやってるなどアドバイスを頂けると喜びます。 コメントや間違いなどがある場合はTwitterに連絡してもらうか Issueに書いていただくと助かります。
xv6の特徴
- Unix 6vがベース
- OSの基本的なアイディアが詰まっている
- ANSI Cで書かれている
- x86(2019年版からはRISC-V)
- コード量が1万行ないくらい
書くこと書かないこと
書くこと
- xv6のコードの解説
- x86の仕組み
- OS特有の用語についての説明
書かないこと
- なぜその機能がOSに必要なのか
e.g. ページングはなぜ必要なのか - アセンブリやC言語のこと
本記事の読み方
章のタイトルが日本語なのは本記事の独自解説です。 英語タイトルの場合はcommentary/textbook にも同じタイトル名があり、その章の解説になります。
以下コード解説のサンプルです。
filename.c
1 int main() 2 { 3 printf("Hello world!"); ~~~ 8 return 0; 9 }
L1: 関数宣言
L3: 表示
L4: 返り値
L行数
がソースコードの何行目のことかを指しており、右側に解説を書きます。
~~~
は省略を表します。
xv6の動かし方
筆者はUbuntu 18.04とDebian GNU/Linux 9.4 (stretch)で動かしています。
他のOSでも基本的にはgcc
とqemu
があれば動かせれると思います。
Makefile
を見るとMac OS X
の記述もあるのでコメントアウトしてみるとできるかもしれません。
動かす
このサイトが参考になりそうです。
必要なツールのインストール
$ sudo apt install git nasm build-essential qemu gdb
コードをもってくる
$ git clone git://github.com/mit-pdos/xv6-public.git $ cd xv6-public $ git checkout xv6-rev11
Make 一度動かすと
kill
コマンドで消すしかなさそうです。$ make qemu # GUIありの起動 $ make qemu-nox # GUIなしの起動
デバッグ(GDB)
起動
$ make qemu-nox-gdb # Booting with gdbserver
アタッチ
xv6を動かした状態で別でシェルを起動させてgdbを起動させます。$ cd <path to xv6> $ gdb
gdbで以下のコマンド実行します。
```
(gdb) source .gdbinit
```
デバッグ
僕はよくgdbで変数の値などを見て動かしながらコードを読んでいました。
gdbで試しながらするのは結構おすすめです。
試しにmkdir
のコマンドを少し覗いてみます。 gdb側で以下のコマンドを実行します。(gdb) b sys_mkdir (gdb) layout src (gdb) continue
起動したxv6側でmkdir
を実行します。
```
$ mkdir test
```
するとgdb側で反応があると成功です。
xv6を落とす
gdb側でxv6を落とします。(gdb) kill
執筆時は2019-03 ↩︎