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 が有効になっていることを確認します。
zgrep 'CONFIG_EFI_STUB' /proc/config.gz次に、以下のように新しい UEFI ブートエントリーを作成します。
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 argumentsefibootmgr は efibootmgr パッケージから提供されます。ディストリビューションのパッケージマネージャーを確認するか、https://github.com/rhboot/efibootmgr. を参照してください。
コメント
GitHub で閲覧・コメントする(投稿にはログインが必要です)