OSカーネルの基礎
ハードウェアを抽象化し、プロセスを保護・スケジュールする中核ソフトウェア。学習用OS xv6 を題材に基本機構を整理する。
保護と特権モード
- kernel mode / user mode を分け、メモリ確保・ファイルR/W・I/Oなどは特権命令が必要なため kernel mode で実行する。
- ユーザ↔カーネルの遷移は割り込み・例外で起こる。
- interrupt: 外部イベント(キーボード、ネットワーク、タイマ)。
- fault: プログラムの異常(不正メモリアクセス、0除算)。
- trap: 明示的なプログラム動作(システムコール)。
- abort: ハードウェア故障。
iretでユーザモードに戻る。
システムコールと割り込み
- xv6 では
int $0x40で割り込みを起こし、eaxにシステムコール番号を入れて呼ぶ。 - 起動時に
lidtで割り込み記述子テーブル(IDT)を設定し、SETGATEで各割り込みタイプのハンドラを登録する。 trap()が trapno を見てsyscall()やexit()に振り分け、関数ポインタテーブルで個別のシステムコールへ分岐する。
メモリとコンテキストスイッチ
- カーネルは高位アドレス(
KERNBASE以上)、ユーザは低位。プロセスごとに1つのカーネルスタックを持つ。 - タイマ割り込みで
yield()が走り、swtch()がレジスタ(context構造体)を保存・復元してスレッド/アドレス空間を切り替える。
I/Oとシステム機能
- mmap: ファイル↔メモリのマッピング、inter-process-communication にも使う syscall。
- io_uring: Linux の非同期I/O API(epoll の後継的存在)。
- eBPF: カーネル内で安全に特定処理を走らせる仕組み(トレーシング等)。
- systemd:
.serviceユニットでデーモンを管理(linux)。 - VGA テキストバッファ(
0xb8000)は自作OSの定番出力先。 - Redox のようにファイルシステムやドライバを Scheme(URLスキーム)としてユーザランドで実装するマイクロカーネル設計もある。
- RAID: ストレージの冗長化(0:ストライピング、1:ミラーリング、5:パリティ分散)。
関連: _moc-systems / elf-format / virtualization-hypervisor / xv6