【OSに体感で入門する①】教育用OS xv6-riscvをQEMUで動かす：設定と実行の手引き

素人による授業の備忘録です
(誤っている部分があれば、コメントでご指摘くださると嬉しいです)

## はじめに
MITの講義で使用されている教育用OSであるxv6を用いて、OSについて学んでいきます。xv6のソースコードを読んだり、システムコールを実装することで、UNIXのシンプルなシステム構造について学んでいきます。

## xv6というOS
#### オペレーティングシステムとは
まず、オペーレーティングシステム(OS)は、ハードウェアとアプリケーションソフトウェア・ユーザーの中間に位置する『管理・制御』の役割を担うもののことです。
OSの目的は一般的に以下の3つだと説明されることが多いです。

①ハードウェアの抽象化
②リソース管理
③コンピューターの利用効率化

:::note info
他の技術記事、OSに関わる授業などをとって理解してから手を動かすとより理解が進みます。
個人的におすすめなのが、以下の記事。UNIXの系譜などについてちょっとだけ理解するのに役立ちます。
https://qiita.com/zawawahoge/items/2ec3b638422c7c8cac8f
特にハードウェア「抽象化」に関しては、以下の記事からざっくりと理解してから読むと、よりわかりやすく全体像を噛み砕けるかと思いました。
https://www.ohitori.fun/entry/what-is-abstraction-in-computer-science
:::

#### xv6とは
今回においては、MITが提供しているxv6というOSを用いることになります。
『xv6-RISCV』というのは、「xv6」というオペレーティングシステム（OS）をRISCVという命令セットアーキテクチャ（ISA: Instruction Set Architecture）上で動かしていることを意味します。

:::note info
命令セットアーキテクチャに関しては以下を参照。
https://qiita.com/rihib/items/6b70361b48c3840d09b0
xv6-RISCVに関しては以下を参照すると良い。
https://jupiteroak.hatenablog.com/entry/2021/12/10/055000
:::

xv6はユーザー管理の概念がなく、システムコールが24個しかない非常にシンプルな教育用OSです。そのため、最初に体感で理解し、OSの基本的なイメージをつけるには十分な教材だと思います。

実際のLinuxシステムコールは400個以上存在していたりします。実際のOSと比較しながら、ソースコードを追っていくと面白いかもしれないです。
[Linuxシステムコールのテーブル]
https://syscalls.mebeim.net/?table=x86/64/x64/latest
システムコールの詳細は以下などを追うと良い。
https://qiita.com/sxarp/items/aff43dd83b0da69b92ce


## 用意するもの
xv6-riscvのソースコード
https://github.com/mit-pdos/xv6-riscv
『xv6: a simple, Unix-like teaching operating system』のpdf
https://pdos.csail.mit.edu/6.828/2023/xv6/book-riscv-rev3.pdf
『xv6: シンプルで Unix 風な教育用オペレーティングシステム』という日本語訳されたものは以下
https://www.sugawara-lab.jp/fig/xv6-riscv-jpn.pdf
>ソースコードと照らし合わせながら、これらの文献を読むととても勉強になります。

## 環境構築

まずは、手元の環境で動かすための環境構築をしていきます。
基本的な構成は、qemuという仮想化ソフトウェアを使います。qemuはいわゆる、エミュレーターです。
qemuを用いる理由は、実際のハードウェア(機材)を用意しなくても、簡単にOSを試すことができるからです。

qemuについて気になる場合は、ドキュメントや記事などを参照してください。
https://www.qemu.org/
https://valinux.hatenablog.com/entry/20230112


①まずは、qemuのインストールを行います。
```powershell
$ brew install quem
```

②QEMU上でxv6-RISCVを動かすための必要なツールをダウンロードしてきます。
```powershell
$ brew tap riscv-software-src/riscv
$ brew install riscv-tools
```
以下参照
https://github.com/riscv-software-src/homebrew-riscv

③qemuのバージョンを確認し、正常にインストールされているかを確認します。
```powershell
$ qemu-system-riscv64 --version
QEMU emulator version 5.1.0(例)
Copyright (c) 2003-2020 Fabrice Bellard and the QEMU Project developers
```
④以上を確認して、xv6-RISCVのソースコードをダウンロードします。

以下のリポジトリをgit cloneしてくる。
```powershell
$ git clone https://github.com/mit-pdos/xv6-riscv
```
ソースコード：https://github.com/mit-pdos/xv6-riscv


## qemuを上げる
cloneしたディレクトリに移動```cd xv6-riscv```して、以下を実行。
qemuからxv6を起動させます。
```powershell
$ make qemu
```

以下のような表示が出たら、正常にxv6-RISCVの起動が成功しています。
```shell
PC@test xv6-riscv % make qemu
qemu-system-riscv64 -machine virt -bios none -kernel kernel/kernel -m 128M -smp 3 -nographic -global virtio-mmio.force-legacy=false -drive file=fs.img,if=none,format=raw,id=x0 -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0

xv6 kernel is booting

hart 1 starting
hart 2 starting
init: starting sh
$
```


## qemuを落とす

他のTerminalを立ち上げて、プロセスをkillして抜ける。
```powershell
pkill -9 qemu-system-riscv64
```
本記事では今後、```shutdown```の挙動などもまとめていきます。

## 実際に立ち上げてソースコードを読んでいこう

ソースコードを読むときは、```grep```コマンドとかを使ってなるべく見当をつけながら楽して読むのが一般的です。
もしくは、vs-codeを使って、ショートカット等を使って操作できるのが一番楽だと思います。

:::note info
個人的におすすめのVScodeのショートカットに関する記事がおすすめです。意外とこういうの、バカにできないなと思います。
https://qiita.com/12345/items/64f4372fbca041e949d0
:::




OSに体感で入門する②につづく...