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