最近, 気分転換にxv6を読むことを画策している. せっかくなので手元で動かして様子を見てみたいが, 環境を汚したくないのでDockerを使う. 私は潔癖症である.

xv6とは

xv6 is a re-implementation of Dennis Ritchie’s and Ken Thompson’s Unix Version 6 (v6).

README - mit-pdos/xv6-public

簡単に言えば, MITの教育用超軽量Unix. ANSI Cで書かれているので, 個人的な勉強にも使える. 私はCPU実験で実装する記事を読んでこれを知った.

今回はRISC-Vに移植されたxv6を使う.

mit-pdos/xv6-riscv: Xv6 for RISC-V

最近のMITの授業ではこちらが使われているらしい. 楽しそう.

Dockerでビルド

本家をForkしてDocker関係のファイルを追加した.

siubiang/xv6-riscv

git clone https://github.com/siubiang/xv6-riscv
cd xv6-riscv
docker-compose build
docker-compose run xv6
# lots of output
init: starting sh
$

docker-compose run xv6でxv6が起動する. 終わるときは, 端末のタブを閉じれば自動的にコンテナも削除される.

正直, Dockerを使わなくてもビルドは簡単であるが, RISC-Vのツールチェインをわざわざ用意するのは… 得にMacの人は手数が多いのでなおさら面倒だろう.

以下, 変更点.

Dockerfile

ビルドについては授業のページが詳しい.

FROM debian:10.3

RUN apt-get update && apt-get install -y \
  git \
  build-essential \
  gdb-multiarch \
  qemu-system-misc \
  gcc-riscv64-linux-gnu \
  binutils-riscv64-linux-gnu

WORKDIR /xv6
CMD [ "make", "qemu" ]

docker-compose.yml

私はdocker runコマンドが嫌いなので docker-compose.ymlも書く.

version: "3.8"
services:
  xv6:
    build: .
    container_name: xv6
    volumes:
      - .:/xv6
    working_dir: /xv6

これらをMakefileと同じフォルダに突っ込んだ.

デバッグ…?

make qemu-gdbでデバッグ環境ができるらしいが,

make qemu-gdb
*** Now run 'gdb' in another window.

と表示されるだけで何も起きない. 端末にHyperを使っているからかもしれないが, デバッグはまだ必要ないので, そっとしておく.