以前MITのOS教材として使われているというxv6というOSを動かしてみた。 これは普段使っているパソコンのCPU(Intel x86)がターゲットとなっていて動かして試せるので、非常にモチベがあがる。
しかししばらく前からMITはオープンソースなCPUのRISCVをターゲットとした別のリポジトリxv6-riscvに移行してしまい、x86版のリポジトリはほぼ更新されない状態になってしまった。 RISCV版を動かすための開発・動作環境をどう用意するのか難しくないかと移行をためらっていたが、ようやく腰を上げて試してみた。
動作環境:macOS Catalina
qemu
brew install qemu
で入るのかな?
すでにインストール済みだった:
$ which qemu-system-riscv64 |
RISCVツールチェインのインストール
https://github.com/riscv/homebrew-riscv に書かれている手順に従って、Homebrew でインストール:
$ brew tap riscv/riscv |
/usr/local/bin/
内にシンボリックリンクが貼られる。
$ ls /usr/local/bin/riscv64-* |
自分でビルドする場合
riscv/riscv-gnu-toolchain をビルドするとのこと。
./configure --prefix=
でインストール先を指定するが、 /opt/riscv
だと管理者権限を要求する?かよくわからなかったので、自分のホーム以下にした。
で make
すると途中エラーで失敗してしまう。
Issueに上がっているのと同じで、 free
関数が定義されてないとかでコンパイルエラーが出る
(Getting Issues on make on Mac ( Catalina) · Issue #745)。
参照しているサブモジュールの riscv-gdb
が古い?ようで、更新したところビルドに成功した:
$ git clone --recursive https://github.com/riscv/riscv-gnu-toolchain.git # サブモジュールもクローンされる |
configure
で指定した ~/opt/riscv
の bin
内にツールチェインの実行ファイルがインストールされるので、パスを通してやる。
xv6-riscv のビルド
xv6-riscv をクローンして make
する。
x86用のXV6ではホスト環境のgccなどがそのまま使えるが、RISCV用は先程ビルド・インストールしたツールチェインを使用する必要がある。
Makefile
内で判定して TOOLPREFIX
変数が設定されるようになっていて、 riscv64-(unknown-elf|linux-gnu-|unknown-linux-gnu-)
が使用される。
(実行ファイルから判定されるので、ツールチェインを自分でビルドした場合にはインストールされた ~/opt/riscv
にパスを通しておくこと。)
$ git clone https://github.com/mit-pdos/xv6-riscv |
make
のターゲットに qemu
を指定することで、qemu 上で実行できる:
$ make qemu |
C-A x
でqemuから抜けられる。
雑感
RISCV のクロスコンパイル環境やエミュレータが整ってるのがすごい。
その上にXV6も問題なく動いていうことなし。
RISCVのCPUをエミュレーションしている?はずなのに普通の速度で動作してしまうってすごすぎるんだが…。
考えてみればx86版も実機で動かしたことはなく動作確認はもっぱらqemuの-nographic
経由だったので、
ユーザ側としてみればあまり違いはないかもしれない(そもそもそれがOSの目的だしね…)。
今後触ってみてx86版との違いや、RISCV版が想定しているハードウェア構成がどうなっているのかなどを見ていきたい。
- リポジトリ内のソースがカーネルとユーザに分かれてわかりやすくなった
- 実行するとビジーループでCPUを100%食うのは相変わらずっぽいね…
- x86版のexitは単にプロセスを終了するだけだったが、終了コードが渡せるようになっていた、成長したな…!
参考
- 6.S081 / Fall 2020 MITのページ
- https://github.com/mit-pdos/xv6-riscv XV6-RISCVのリポジトリ
- xv6: a simple, Unix-like teaching operating system ドキュメント
- xv6: シンプルで Unix 風な教育用オペレーティングシステム 日本語ドキュメント
- MacOSでxv6をインストールする方法|miyanetdev ツールチェインをbrewでインストールする方法
- xv6-riscv を QEMU で動かす 自前でビルドする方法
- xv6-riscvをDockerでビルド ホスト環境にRISCVの開発環境を入れずに済むのでDockerを使えたら便利。 が試してみたところxv6の動作がqemuで動かした場合と比べてちょっと遅い?ような。 Docker for Macがいけないんだろうか?
過去記事
- Xv6を試してみた: x86版を動かす話
- 自作Cコンパイラでセルフホスティングを達成した: XV6(とLinux)上で動くCコンパイラを作る話
- 自作シェルでヒストリを扱えるようにする: XV6シェルにヒストリ機能を足す話