研究目的

  • ブートが高速で、コンパクトなカーネルを実装する。
  • Codesegment と Datasegment をカーネルに実装するにあたって、メモリ管理の役割とどう合致するのかを検証する。
  • 上記を確認したら CbC を用いて、動作が軽く落ちにくいカーネルを実装する。
  • モデル検証に対応し、エラー予測を可能にする
  • カーネルパニックをなくす
  • Mach-O を ELILO でロードし、64bit で動作可能にする

ELILO

現状

ELILO

目標

  • Page Table を初期化
  • 一度 Paging を disable
  • CR3 レジスタに初期化した Page Table を登録
  • 再度 Paging を enable

目標 [EFI version]

  • memmap を設定
  • 新しく仮想メモリ用に memmap を作る
  • irq をセーブして、pgd を作る[TLB をフラッシュ]
  • UEFI API SetVirtualAddressMap を call
  • pgd を登録して、irq をリストア[TLB をフラッシュ]

どちらかの方法で、ELILO 内に Page table を作る

gnu-efi での SetVirtualAddressMap の呼び出し

直接呼び出してみる

  • ExitBootService 後に、 uefi_call_wrapper(RT->SetVirtualAddressMap, 4, mem_map_size, efi_mem_desc_size, mem_desc_ver, mem_map)
  • 失敗,マシンが落ちる
  • 考えられる理由は、gnu-efi が対応していないか、Linux のように、呼び出し前と呼び出し後に必要な処理がないこと

対策

SetVirtualAddressMap の呼び出し

  • Linux に習って、SetVirtualAddressMap に処理を書く
  • 直接アセンブラを書いて EFI の API を呼び出す

Linux での引数 4 つの場合の efi の呼び出し

ENTRY(efi_call4)
  SAVE_XMM
  subq $32, %rsp
  mov %r8, %r9
  mov %rcx, %r8
  mov %rsi, %rcx
  call *%rdi
  addq $32, %rsp
  RESTORE_XMM
  ret
ENDPROC(efi_call4)
      

Vagrant

  • コマンドラインから VM をいろいろ操作できるツール
  • vagrant init: 設定ファイル Vagrantfile の作成
  • vagrant box add [vm name] [path / URL]: vagrant の仮想マシンを登録する
  • vagrant up: VM の開始
  • vagrant destroy: VM を止める
  • vagrant suspend: サスペンドする
  • vagrant package: 自前の VM を vagrant 用に package
  • vagrant ssh: vagrant で起動した VM に ssh する

Vagrant の利点

  • コマンドラインから気軽に操作
  • 開発環境の配布が容易
  • VirtualBox を起動しなくても動く
  • すぐホストと同期可能なディレクトリを持たせられる
  • 起動直後に実行する script を指定できる

今週すること

  • ELILO の中で使われている MemoryMap を使って SetVirtualMemoryMap を試す