Category
ZigでマイクロOS開発
Zigを使い、UEFIブートからカーネル・ドライバまでをゼロから実装していく自作OS開発の記録です。実機での動作検証を交えながら、設計判断とその根拠を追っていきます。
18件の記事
実機起動で見つかったメモリ管理の不具合と、シリアルポートなし環境でのデバッグ
フレームバッファテキスト・USB HIDキーボード・TUIシェル・グラフィックス描画までを対象実機で動作確認します。実機で最初に起きたのは物理フレームアロケータのnullポインタキャストによるpanicで、チェックポイント記録とpanicコールサイトのアドレス表示という2つの手がかりだけで原因を特定します。あわせてUEFI Runtime Servicesを使ったシャットダウンコマンドの実装にも触れます。
続きを読むGOPフレームバッファへのピクセル単位描画API整備
フレームバッファに直接ピクセル・矩形・線を描画するAPIを実装し、テキストコンソールとは独立した描画レイヤーとして組み込みます。
続きを読むフレームバッファコンソール上での簡易TUIシェルの実装
フレームバッファへのテキスト描画とUSBキーボード入力を組み合わせ、行編集・コマンドパーサ・組み込みコマンドを備えた簡易的なシェルを実装します。
続きを読むxHCI経由のUSBキーボード入力とBoot Protocol
実機ではPS/2キーボードのレガシーエミュレーションが機能しないことが確認できたため、USBキーボードをxHCI(Extensible Host Controller Interface)経由でBoot Protocolとして扱う入力経路を実装します。PCIコンフィグレーション空間からのコントローラ検出、TRBによるリング構造、デバイスの列挙とアドレス設定、割り込み転送によるレポート受信までを扱います。
続きを読むフレームバッファへのテキスト描画とpanic表示の刷新
ビットマップフォントを使ってフレームバッファに文字を描画できるようにし、これまで色の塗り潰しだけで代用していたpanic表示を、実際のメッセージやレジスタ情報を読めるテキスト表示に置き換えます。
続きを読むPICの再マッピングとタイマー・キーボードの割り込み処理
PIT(タイマー)とPS/2キーボードを、ポーリングではなく本来の割り込み駆動で扱えるようにします。IDTに例外だけでなくIRQ用のディスパッチを追加し、legacy PICの再マッピングを行ったうえで、Phase 5からずっと保留にしていたIF(割り込み許可フラグ)を初めて有効化します。
続きを読むフリーリスト方式のヒープアロケータとstd.mem.Allocator対応
pmmが貸し出す4KiB単位のページを、もっと小さい任意サイズで確保できるヒープアロケータを実装します。Zig標準の`std.mem.Allocator`インターフェースに対応させ、以後のカーネルコードで標準的なアロケータとして使えるようにする狙いも兼ねています。
続きを読む自前のページテーブルへの切り替えと、そこで踏んだ地雷
UEFIが用意したページテーブルを、カーネル自身が所有するPML4/PDPT/PD/PTに置き換えます。実装自体は前回のGDT置き換えの延長線上ですが、検証の過程で「物理アドレス0を割り当ててはいけない」という、物理フレームアロケータ側に潜んでいた地雷を踏んだので、その調査の記録も残します。
続きを読む物理フレームアロケータの実装
UEFIメモリマップを解析して使用可能な物理メモリ領域を判別し、ビットマップ方式の物理フレームアロケータを実装します。アロケータ自身の管理領域をどこに置くかという、この種のアロケータに特有の鶏と卵の問題への対処もまとめます。
続きを読むIDTを構築してCPU例外を捕捉する
IDT(Interrupt Descriptor Table)を構築し、ゼロ除算などのCPU例外をハンドリングしてpanic表示を出すところまでを扱います。QEMU上での検証方法とその落とし穴についても整理します。
続きを読む自前のGDTとカーネルスタックへの切り替え
UEFIファームウェア由来のGDT・スタックへの依存を断ち切り、カーネル自身が所有するGDTとスタックに切り替えます。QEMU上でのレジスタ確認による検証結果にも触れます。
続きを読むExitBootServicesと自作カーネルへのハンドオフ
ExitBootServicesの呼び出しとBoot Services失効後の世界への移行、自作カーネルへのハンドオフ、GOPフレームバッファへの直接描画による動作確認までをまとめます。
続きを読むUEFIからのメモリマップとGOPフレームバッファ情報の取得
UEFI Boot Servicesを使ってメモリマップとGOPフレームバッファ情報を取得し、カーネルへの受け渡し方式を設計します。QEMU+OVMFでの取得結果とその妥当性の確認までをまとめます。
続きを読むUEFI Boot Servicesによるコンソール出力
UEFI Boot Servicesのコンソール出力プロトコルを使ってHello Worldを表示し、QEMU+OVMFおよび実機での動作確認までをまとめます。実機特有の表示崩れとその原因についても扱います。
続きを読むUEFIアプリケーションのビルド設定
対象実機の制約に基づく設計判断を整理した上で、UEFIターゲット向け`build.zig`の構成、およびQEMU+OVMFによる起動検証の方法をまとめます。
続きを読む用語集
これまでの記事に登場した専門用語を、UEFI・CPU/ハードウェア・メモリ管理・グラフィックス・USB・Zig言語・開発環境・ツールの7カテゴリに分けて整理します。記事の追加にあわせて随時更新します。
続きを読むx86-64 汎用レジスタの逆引きガイド
「AHに0x13をセットする」といった断片的な知識ではなく、x86-64の各レジスタがそもそも何のためにあり、どう使い分けられているのかを逆引き形式で整理します。
続きを読むZig / QEMU+OVMF 開発環境の構築
Ubuntu 22.04上でのZigツールチェイン導入と、QEMU+OVMFによるUEFIエミュレーション環境の構築手順をまとめます。
続きを読む