素人による授業の備忘録です
(誤っている部分があれば、コメントでご指摘くださると嬉しいです)
はじめに
MITの講義で使用されている教育用OSであるxv6を用いて、OSについて学んでいきます。xv6のソースコードを読んだり、システムコールを実装することで、UNIXのシンプルなシステム構造について学んでいきます。
xv6というOS
オペレーティングシステムとは
まず、オペーレーティングシステム(OS)は、ハードウェアとアプリケーションソフトウェア・ユーザーの中間に位置する『管理・制御』の役割を担うもののことです。
OSの目的は一般的に以下の3つだと説明されることが多いです。
①ハードウェアの抽象化
②リソース管理
③コンピューターの利用効率化
他の技術記事、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)上で動かしていることを意味します。
命令セットアーキテクチャに関しては以下を参照。
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のインストールを行います。
$ brew install quem
②QEMU上でxv6-RISCVを動かすための必要なツールをダウンロードしてきます。
$ brew tap riscv-software-src/riscv
$ brew install riscv-tools
以下参照
https://github.com/riscv-software-src/homebrew-riscv
③qemuのバージョンを確認し、正常にインストールされているかを確認します。
$ 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してくる。
$ git clone https://github.com/mit-pdos/xv6-riscv
ソースコード:https://github.com/mit-pdos/xv6-riscv
qemuを上げる
cloneしたディレクトリに移動cd xv6-riscv
して、以下を実行。
qemuからxv6を起動させます。
$ make qemu
以下のような表示が出たら、正常にxv6-RISCVの起動が成功しています。
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して抜ける。
pkill -9 qemu-system-riscv64
本記事では今後、shutdown
の挙動などもまとめていきます。
実際に立ち上げてソースコードを読んでいこう
ソースコードを読むときは、grep
コマンドとかを使ってなるべく見当をつけながら楽して読むのが一般的です。
もしくは、vs-codeを使って、ショートカット等を使って操作できるのが一番楽だと思います。
個人的におすすめのVScodeのショートカットに関する記事がおすすめです。意外とこういうの、バカにできないなと思います。
https://qiita.com/12345/items/64f4372fbca041e949d0
OSに体感で入門する②につづく...