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.
Xv6を読む際の注意点
Xv6は、レガシーBIOSからブートし、32bitモード(プロテクトモード)で動作するOSです。2020年から不要になるであろう、レガシーBIOSに関わる仕様(旧式のブート方法、リアルモード、プロテクトモード、MPspecification など)を勉強しなければなりません。詳しくは以下の記事を参考にしてください。
そもそもレガシー BIOS というのは「30 日でできる!OS 自作入門」で最初の方に触れる,パソコンのファームウェアです. 「30 日でできる!OS 自作入門」の中では,画面にメッセージを表示したり,フロッピーディスクからデータを読み込んだりするのに使いますね.
レガシーと言われるのは,それが登場した時期が古く,互換性のために過去のしがらみをずっと引きずっているからです.
、、、(略)、、、
この,UEFI なのにレガシー BIOS のインターフェースが使える状態を実現しているのが,UEFIの CSM(Compatibility Support Module)と呼ばれる互換性機能です. 11 月のニュースは,Intel製の UEFI 実装から CSM を 2020 年までに削除するというニュースなのです
一つ目の大きな違いは、ブートプロセスにあります。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 BIOSとUEFI 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 本体を作る時間に費やした方がお得ですよね。
UEFIにはMP Floating Point Structureはありません。
他にも、表示回路の古い規格であるVGA、シリアル通信の古い規格であるUART8250、HDDの古い接続規格であるIDEなども勉強しなければなりません。
コードリーディングで使用したツール
参考
書籍
- 猫でもわかるC言語プログラミング
書籍
書籍
- はじめて読む486―32ビットコンピュータをやさしく語る 単行本
- はじめて読むMASM―ソフトウェア環境のからくりを学ぶ
- はじめて読む8086―16ビット・コンピュータをやさしく語る
- 新装改訂版 Linuxのブートプロセスをみる
ELFファイル・リンカスクリプト関連
書籍
gas(GNU assembler)
書籍
URL
URL
- GCCのインラインアセンブラの書き方 for x86 - OSのようなもの
- http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Extended-Asm.html#Extended-Asm
- http://caspar.hazymoon.jp/OpenBSD/annex/gcc_inline_asm.html
- GCCのインラインアセンブラの構文について調査 - FPGA開発日記
OS関連
書籍
入出力装置へのアクセス方法
書籍
- 12ステップで作る組込みOS自作入門
- 組込みI/Oインタフェース基礎講座
URL
- https://uquest.tktk.co.jp/embedded/learning/lecture13.html
- I/Oポートとは - 意味をわかりやすく - IT用語辞典 e-Words
- https://w.atwiki.jp/kumikomi-yitjc/sp/pages/12.html
- 16bit PC アーキテクチャ - Qiita
APICシステム(Local APIC + I/O APIC)
URL
- APIC - OSDev Wiki
- Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3A→CHAPTER 10 ADVANCED PROGRAMMABLE INTERRUPT CONTROLLER (APIC)
- IOAPIC - OSDev Wiki
- http://pdf.datasheetcatalog.com/datasheet/Intel/mXtwstt.pdf
- I/O APICについて - 睡分不足
VGA(Video Graphics Array)
URL
UART(シリアル通信)
URL
- http://archive.linux.or.jp/JF/JFdocs/Serial-HOWTO.txt
- RS232 I/O and IRQ's - Lammert Bies
- https://www.lammertbies.nl/comm/info/serial-uart
- Serial Programming/8250 UART Programming - Wikibooks, open books for an open world
- シリアル通信 | dotstudio
- 通信ソフトを作る(その1)
- http://tri-s.world.coocan.jp/SfStS_N64/SfStS_Common/UART/Explain_UART.html
KBC(キーボードコントローラ)
URL
URL
- IDE機器の転送方式について、PIOモードというものがありますが、PIOモードとは何ですか? - PQIグループ- モバイル向け周辺機器の総合メーカー [Apple アクセサリ, モバイルアクセサリ, モバイルバッテリー, USB フラッシュドライブ, Wi-Fi ストレージ, 充電器]
- ハードディスクの構造とパーティション by eslab
- ATA PIO Mode - OSDev Wiki
- PC Architecture. A book by Michael B. Karbo
URL
URL
Multiprocessor Specification関連
URL
- https://pdos.csail.mit.edu/6.828/2018/readings/ia32/MPspec.pdf#page37
- https://pdos.csail.mit.edu/6.828/2018/readings/ia32/MPspec.pdf#page75
- Memory Map (x86) - OSDev Wiki
- xv6のブートプロセスにおけるEBDAとBDAについて - FPGA開発日記
- MP Floating Pointer Structureを調べる - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモ
- MP Configuration table Headerの仕組み - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモ
- MP Configuration Table Entriesの内容 - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモ
URL
日本語がおかしい文章、間違った内容を説明している文章、説明がわかりにくい文章、などありましたら、https://twitter.com/jupiteroaknp までコメント下さい。