Xv6を読む~OSコードリーディング~ ①はじめに

目次

Xv6とは

Xv6とは、MIT(マサチューセッツ工科大学)がUnix v6をx86CPUの仕様に基づいて再実装した教育用のオペレーティングシステムです。

Xv6 is a teaching operating system developed in the summer of 2006 for MIT's operating systems course, 6.828: Operating System Engineering.

https://pdos.csail.mit.edu/6.828/2018/xv6.html

ソースコード
https://github.com/mit-pdos/xv6-public

公式ページ
https://pdos.csail.mit.edu/6.828/2018/

教科書
https://pdos.csail.mit.edu/6.828/2018/xv6/book-rev11.pdf

ソースコードのプリントアウト
https://pdos.csail.mit.edu/6.828/2018/xv6/xv6-rev11.pdf

Unix v6について

Unix v6は、ベル研究所のKen ThompsonとDennis Ritchieらによって開発され、1975年にリリースされたオペレーティングシステムです。PDP11という古いプロセッサ上で動作します。「はじめてのOSコードリーディングーUNIX V6で学ぶカーネルのしくみ」という本の題材にもなっています。
https://minnie.tuhs.org/cgi-bin/utree.pl
https://minnie.tuhs.org/cgi-bin/utree.pl?file=V6

Xv6-riscvについて

Xv6-riscvは、MITがXv6をRISC-V CPUの仕様に基づいて再実装した教育用のオペレーティングシステムです。

Xv6 is a teaching operating system developed in the summer of 2006 for MIT's operating systems course, 6.828: Operating System Engineering. In 2019, we ported xv6 to RISC-V for a new undergraduate class 6.S081.

https://pdos.csail.mit.edu/6.828/2019/xv6.html

ソースコード
https://github.com/mit-pdos/xv6-riscv

公式ページ
https://pdos.csail.mit.edu/6.828/2019/index.html

教科書
https://pdos.csail.mit.edu/6.828/2019/xv6/book-riscv-rev0.pdf

教科書(和訳)
https://www.sugawara-lab.jp/fig/xv6-riscv-jpn.pdf
電気通信大学の菅原研究室のHP和訳された教科書があります。

MITでは、今後、xv6-riscvを用いたOSの講義(6.S081)を学部生の科目にし、xv6を用いたOSの講義(6.828)を大学院生の科目にしていくようです。

Aug 1, 2019: This fall we will offer a new operating system class, as an experimental subject: 6.S081. It is intended for undergraduates who enjoyed 6.004 and want to learn about design and implementation of operating systems, and their use as a foundation for systems programming. A multi-processor operating system for RISC-V is used to illustrate these topics. Individual laboratory assignments involve extending an operating system kernel, for example to support sophisticated virtual memory features and network protocols. Programming experience is a prerequisite, ideally in the C language. 6.S081 will fulfill the AUS requirement.
If you were planning to take 6.828, sign up for 6.S081. If you need 6.828's G units for your Meng, register for 6.828. We will teach 6.S081/6.828 as a single class, but will have extra assignments for the 6.828 students. Long-term we intend to make 6.S081 a permanent undergraduate subject and upgrade 6.828 to a true graduate subject.

https://pdos.csail.mit.edu/6.828/2019/index.html

Xv6を読む際の注意点

Xv6は、レガシーBIOSからブートし、32bitモード(プロテクトモード)で動作するOSです。2020年から不要になるであろう、レガシーBIOSに関わる仕様(旧式のブート方法、リアルモード、プロテクトモード、MPspecification など)を勉強しなければなりません。詳しくは以下の記事を参考にしてください。


uchan.hateblo.jp

そもそもレガシー BIOS というのは「30 日でできる!OS 自作入門」で最初の方に触れる,パソコンのファームウェアです. 「30 日でできる!OS 自作入門」の中では,画面にメッセージを表示したり,フロッピーディスクからデータを読み込んだりするのに使いますね.
レガシーと言われるのは,それが登場した時期が古く,互換性のために過去のしがらみをずっと引きずっているからです.
 、、、(略)、、、
この,UEFI なのにレガシー BIOS のインターフェースが使える状態を実現しているのが,UEFIの CSM(Compatibility Support Module)と呼ばれる互換性機能です. 11 月のニュースは,Intel製の UEFI 実装から CSM を 2020 年までに削除するというニュースなのです


knowledge.sakura.ad.jp

一つ目の大きな違いは、ブートプロセスにあります。Legacy BIOSでは、各記憶装置の最初の512バイト(MBR)を読み出して、その領域の末尾に、起動可能かどうかを示すマジックナンバー(0x55, 0xAA)があるかを確認して、それが存在すればそのデータを0x7c00番地に配置して、そこに実行を引き渡します。
、、、(略)、、、
一方UEFI BIOSでは、各記憶装置上のファイルシステムを読み、仕様書で規程されているパス(x86_64アーキテクチャにおいては/EFI/BOOT/BOOTx64.EFI)に置かれている実行ファイルをロードするようになっています。これにより、最初にロードされるプログラムのサイズの制限が実質なくなり、自作OS開発者にとっては多段階のブートローダを書く必要がないという利点があります。
、、、(略)、、、
Legacy BIOSでは、ブートローダがロードされた直後のCPUの実行モードはリアルモードであり、プロテクトモードやロングモードへの移行やページングの有効化はOS側で行う必要がありました。一方UEFI BIOSでは、ロードされた直後からすでに64ビットモードで動きはじめます。
現代のCコンパイラでは、16bitコードを正しく出力することはもはや難しくなってしまっているので、Legacy BIOSを使用する場合は、どうしてもアセンブラを利用してブートローダや32bitモードへの移行までを記述する必要があります。しかし、UEFI BIOSを利用すれば、最初から64bitモードで動作するため、CやC++、Rustなどの高級言語を利用してOSをすべて記述することも可能です。
、、、(略)、、、
Legacy BIOSUEFI BIOSには、これまで見てきたように、互換性のない違いが数多くあります。しかし、これまではLegacy BIOS向けに書かれたソフトウェアが動かないというケースはあまり多くありませんでした。これは、UEFI BIOSのCompatibility Support Module (CSM)という機能によって、Legacy BIOSがエミュレーションされていたためでした。しかし、Intelは2020年までに、このCSMを搭載しない、UEFI Class 3 への移行をすると発表しています。


https://neriring.hatenablog.jp/entry/2018/12/07/190016neriring.hatenablog.jp

このように、 BIOS は設計が古いのでモダンな OS を起動するにはたくさんのステップを踏む必要がありますが、 UEFI なら最初から考えなくていい問題が多いです。未来のない BIOS で消耗するより UEFI で解決して OS 本体を作る時間に費やした方がお得ですよね。


pibvt.hateblo.jp

UEFIにはMP Floating Point Structureはありません。


他にも、表示回路の古い規格であるVGA、シリアル通信の古い規格であるUART8250、HDDの古い接続規格であるIDEなども勉強しなければなりません。

参考


C言語

書籍

  • 猫でもわかるC言語プログラミング


アセンブリ言語

書籍


x86アーキテクチャ(IA-32アーキテクチャ)

書籍

  • はじめて読む486―32ビットコンピュータをやさしく語る 単行本
  • はじめて読むMASM―ソフトウェア環境のからくりを学ぶ
  • はじめて読む8086―16ビット・コンピュータをやさしく語る
  • 新装改訂版 Linuxのブートプロセスをみる


ELFファイル・リンカスクリプト関連

書籍


gas(GNU assembler)

書籍

URL


インラインアセンブラ

URL


OS関連

書籍

  • 詳解 Linuxカーネル 第3版
  • 作って理解するOS x86系コンピュータを動かす理論と実装


入出力装置へのアクセス方法

書籍

  • 12ステップで作る組込みOS自作入門
  • 組込みI/Oインタフェース基礎講座

URL


APICシステム(Local APIC + I/O APIC)

URL


VGA(Video Graphics Array)

URL


UART(シリアル通信)

URL


KBC(キーボードコントローラ)

URL


IDE(ATA)

URL


ファイルシステム(xv6のファイルシステム)

URL


排他制御(xv6の排他制御、lock)

URL


Multiprocessor Specification関連

URL


CMOS

URL


日本語がおかしい文章、間違った内容を説明している文章、説明がわかりにくい文章、などありましたら、https://twitter.com/jupiteroaknp までコメント下さい。