研究目的
- ブートが高速で、コンパクトなカーネルを実装する。
- Codesegment と Datasegment をカーネルに実装するにあたって、メモリ管理の役割とどう合致するのかを検証する。
- 上記を確認したら CbC を用いて、動作が軽く落ちにくいカーネルを実装する。
- モデル検証に対応し、エラー予測を可能にする
- カーネルパニックをなくす
- Mach-O を ELILO でロードし、64bit で動作可能にする
ELILO
現状
ELILO
目標
- Page Table を初期化
- 一度 Paging を disable
- CR3 レジスタに初期化した Page Table を登録
- 再度 Paging を enable
ELILO
作業[1]
- 結局 ExitBootService を通して成功したのは GDT/IDT の操作のみ
- CR3 へ PML4 の先頭アドレスを入れるために CR0.PG を disable すると落ちる
- CR4.PCIDE を disable にするだけなら通る
ELILO
EFI Runtime Services[SetVirtualAddressMap]
- EFI から OS を Boot するためのサービスが Boot Services
- OS が走っている状態で、EFI を操作するためのサービスが Runtime Services
- SetVirtualAddressMap()
- Changes the runtime addressing mode of EFI firmware from physical to virtual.
ELILO
EFI Runtime Services[SetVirtualAddressMap]
- x86_64_start_kernel
- x86_64_start_reservations
- start_kernel // カーネルの初期化
- setup_arch // アーキテクチャごとの設定
- efi_init // efi の初期化
- efi_enter_virtual_mode
0x4000 でブートローダから EFI その他の情報を受け取る