UEFI と EDK II

最終更新: 2022-04-13 08:27:02 +0800 +0800
tags: Edk-Ii | Firmware | Uefi
原文は英語で書かれています。あなたはAI翻訳版を読んでいます。

UEFI は、プラットフォームファームウェアと OS の間のファームウェアインターフェースです。UEFI Forum は UEFI および Platform Initialization(PI)仕様を公開しています。EDK II は TianoCore のリファレンス実装およびビルド環境です。

ブートフェーズ #

PI アーキテクチャは、ファームウェアの初期実行を複数のフェーズに分割します。Pre-EFI Initialization(PEI)は、CPU と一時ストレージ以外がほとんどない状態で開始します。PEI Foundation は PEI モジュール(PEIM)を実行し、PPI(PEIM 間インターフェース)を公開し、ハンドオフブロック(HOB)を使用して検出済みリソースを記述します。中心的な役割は、次のフェーズに十分な RAM を初期化することです。

続いて Driver Execution Environment(DXE)がファームウェアボリュームからドライバーとサービスをロードし、UEFI プロトコルをインストールして、UEFI システムテーブルを構築します。Boot Device Selection は OS のブートオプションを選択してロードします。ExitBootServices の後、通常のブート時ハードウェアリソースは OS が所有します。UEFI ランタイムサービスを引き続き利用できるのは、プラットフォームがサポートする場合に限られます。ACPI テーブルは、ハードウェアおよび電源管理インターフェースを OS に記述します。

ファームウェアイメージ #

フラッシュデバイス(FD)は、物理的または論理的なファームウェアイメージです。FD には 1 つ以上のファームウェアボリューム(FV)が含まれます。FV は通常 Firmware File System(FFS)を使用する、書式化されたコンテナです。FFS ファイルは、実行可能セクション、生データ、圧縮セクション、およびその他のファームウェアコンテンツをまとめます。FDF ファイルは、これらの要素から FFS ファイル、FV、更新カプセル、オプション ROM、そして最終的な FD イメージを構成する方法を記述します。

大部分のモジュールは再配置可能であり、RAM にロードされます。execute-in-place モジュールは固定 ROM アドレス向けにリンクされ、フラッシュから直接実行できます。両方のモードをサポートするモジュールもあります。

EDK II のメタデータとビルドフロー #

EDK II パッケージは、複数の宣言的ファイルを使用します。

  • .dec パッケージ宣言は、GUID、プロトコル、ライブラリクラス、およびインクルードパスを公開します。
  • .inf モジュール情報ファイルは、モジュールのソース、依存関係、ライブラリクラス、パッケージ、およびビルドオプションを記述します。ソース、バイナリー、または混合コンテンツを記述でき、ソースモジュールのビルドでは AsBuilt INF が生成されます。
  • .dsc プラットフォーム記述ファイルは、コンポーネント、ライブラリインスタンス、ツールチェーン設定、およびプラットフォーム全体の設定を選択します。.dsc.inc ファイルは共有フラグメントを分離します。
  • .fdf フラッシュ定義ファイルは、最終的なファームウェアイメージのレイアウトを定めます。

BaseTools はこのメタデータを読み取り、ライブラリを解決して、AutoGen.c と AutoGen.h を生成します。選択されたツールチェーンがソースファイルをコンパイルし、ライブラリオブジェクトをアーカイブします。リンカーは中間イメージを生成します。Windows 以外のホストでも、多くの場合は .dll という名前です。GenFw は中間イメージを PE/COFF EFI イメージ(.efi)へ変換し、EFI ブートサービスドライバーなどの適切な EFI サブシステムを設定します。その後、モジュールが FFS ファイル、FV、および最終的な FD イメージへパッケージ化されます。

Human Interface Infrastructure(HII)は、人間向けのファームウェアリソースを包括する仕組みであり、文字列、フォント、画像、および設定フォーム(IFR)のデータベースを対象とします。

移行された参考資料 #

EFISTUB は Linux カーネルの機能であり、vmlinux を EFI アプリケーションとして直接呼び出せるため、GRUB2 などのブートローダーが不要になります。

最初に、カーネルで EFISTUB が有効になっていることを確認します。

sh
zgrep 'CONFIG_EFI_STUB' /proc/config.gz

次に、以下のように新しい UEFI ブートエントリーを作成します。

sh
efibootmgr --create
    --disk ... # device node e.g. /dev/sdX
    --part ... # partition number
    --label ... # Entry Nickname
    --loader '/vmlinuz-linux'    # the executable path under the given partition
    --unicode       # interpret the following string in UCS-2 as argument to the EFI application, in our case, the kernel
    'root=UUID=01a40dd8-28f0-4636-be1e-aeed60c98095 resume=UUID=2d877d5d-4ca1-4d46-a3d6-b6ee94cbbd78 rw rootflags=subvol=@ loglevel=3 quiet initrd=\initramfs-linux-lts.img'        # kernel arguments

efibootmgr は efibootmgr パッケージから提供されます。ディストリビューションのパッケージマネージャーを確認するか、https://github.com/rhboot/efibootmgr. を参照してください。

コメント

GitHub で閲覧・コメントする(投稿にはログインが必要です)