diff --git a/src/assets/ymir.gif b/src/assets/ymir.gif new file mode 100644 index 0000000..897cd73 Binary files /dev/null and b/src/assets/ymir.gif differ diff --git a/src/intro.md b/src/intro.md index 24ba9d0..6c0c794 100644 --- a/src/intro.md +++ b/src/intro.md @@ -3,22 +3,115 @@ Ymir Ymir, the Type-1 Baremetal Hypervisor +
+ +**Writing Hypervisor in Zig** は [Zig](https://ziglang.org/) 言語を使いフルスクラッチで Type-1 Hypervisor を実装しようというブログシリーズです。 +OS よりも低いレベルで動作するベアメタル Hypervisor を実装するにあたり、ブートローダ・カーネル・VMM の各コンポーネントをイチから組み立てていきます。 + +本シリーズでは **Ymir** という名前の Hypervisor を実装します。 +Ymir は Intel 64 (x86-64) CPU で動作し、Intel VT-x によるハードウェア仮想化支援機能を活用します。 +Ymir は以下の特徴を持ちます: + +- **Type-1 Hypervisor**: OS に一切依存しません +- **Linux をブート可能**: Linux カーネルをブートするにに必要十分な機能を実装します +- **フルスクラッチ**: ライブラリなどの依存が一切ありません +- **Thin Hypervisor**: 必要な場合のみゲストに介入し、それ以外はパススルーします + +実装や説明を簡単にするため、Ymir は以下のような制約を持ちます: + +- SMP (Symmetric Multi-Processing) はサポートしません +- QEMU での開発を想定しており、実機での動作は確認していません + - 実機で動かすには多少の修正が必要になるはずです +- APIC はサポートしません +- シングルゲストのみをサポートします + +本シリーズは全部で 30 程度のチャプターから構成されており、 +各チャプターはとあるテーマの概念的な説明と実装の両方を含んでいます。 +各チャプターを読みながら実際にコードを書いていくことで、最終的に Linux をブートすることができる Hypervisor が完成します: + +Ymir + +## 対象読者 + +本シリーズは以下のような読者を想定しています: + +- OS に対するある程度の理解がある、または自分でマニュアルを読んで調べることができる +- Zig 言語に興味がある、または既に使ったことがある +- 全てイチから低レベルコードを書きたい +- Intel VT-x をサポートする CPU を持っている + +逆に、以下のような人には向いていません: + +- マイナー言語なんて使いたくない +- 絶対に自分で言語や CPU のリファレンスを調べたくない +- 簡単のための機能削減や多少の厳密性の犠牲を許容できない +- Intel 64 の CPU を持っていない + +## 進め方 + +本シリーズはチャプター1から順に読み進めていくことを想定しています。 +各チャプターはそれまでのチャプターに対する依存を持っており、既に登場したコードは実装されたものとして扱います。 + +本シリーズは実際に手を動かしてコードを書いていくことが強く推奨されます。 +リファレンス実装である Ymir は [Github で公開](https://github.com/smallkirby/ymir) されています。 +各チャプターにおける最終的なコードは上記リポジトリの [writing-hypervisor-in-zig ブランチ](TODO) のタグに対応しています。 +チャプター内で省略された箇所やスニペットでは分かりにくかった箇所は、対応するタグを参照することで確認することができます。 + +なお、本シリーズで実装する `writing-hypervisor-in-zig` ブランチの Ymir は簡単のために +`master` ブランチの Ymir から一部機能が削減・簡略化されている可能性があります。 + ## 記法について -TODO +コードのスニペットは以下のようなコードブロックで提示されます: + +```zig +const x: u8 = 0xDEADBEEF; +``` + +ファイル名を持つコードブロックは、そのファイルに対して新たに追加されるコードを意味します。 +このような場合 `...` は既存のコードを省略するのに使われます: + +```ymir/main.zig +fn main() !void { + ... + const new_code = 0xDEADBEEF; + ... +} +``` + +ファイル名に `.tmp.` が含まれるコードは、実験棟のために一時的に追加するコードであることを意味します。 +このようなコードはチャプターの終了時に削除されるべきです: + +```ymir/main.tmp.zig +const tmp: u8 = 0xDEADBEEF; +``` + +Zig の `struct` や `enum` のフィールドは、本文中で `.field` のように表記されます。 +例として、以下のような構造体のフィールドは `.one` または `Some.one` のように表記されます: + +```zig +const Some = struct { + one: u8, + two: u16, +}; +``` - ビット記法: `SOME[3:0]` - コードブロック(ファイル名) -## オリジナル Ymir との違い +## 改善・修正 -TODO +以下のような場合には、筆者に対して更新をリクエストしてください: -- 一部機能を省略 +- 説明に技術的な誤りがある +- 分かりにくい表現がある +- 誤字・脱字等を見つけた +- 提示されたコードが動かない、または分かりにくい +- 本シリーズでは扱っていない内容を新たに扱ってほしい -## Improve and Request Contents - -TODO +更新リクエストは [GitHub](https://github.com/smallkirby/writing-hypervisor-in-zig) の Issue や Pull Request で受け付けています。 +PR を作る前に Issue を建てる必要はありません。 +リクエストの大小や内容の正誤に関わらず修正依頼やリクエスト等を歓迎します。 ## References @@ -41,6 +134,10 @@ SDM 以外には、以下の情報を参考にしています: その他局所的に参考にした情報については各ページに記載します。 +## ライセンス + +[ライセンス](./license.md) を参照してください。 + ## Changelog TODO diff --git a/theme/custom.css b/theme/custom.css index 18ed944..dcc7710 100644 --- a/theme/custom.css +++ b/theme/custom.css @@ -114,6 +114,18 @@ img.cc { width: 95%; } +#ymir-gif { + width: 70%; + display: block; + margin-left: auto; + margin-right: auto; + border-radius: 0.5em; + + @media (max-width: 1080px) { + width: 95%; + } +} + @keyframes fadeIn { 0% { opacity: 0;