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エミュレーション環境の構築手順をまとめます。

続きを読む