BDS to TSL Handoffとは?

BIOS/UEFIのBDS to TSL handoffを説明します。BootOrder、Boot####、Device Path、ConnectController、LoadImage、StartImageを扱います。

更新 約 4 分
Đọc bằng 日本語 Tiếng Việt English
Firmware Flow cover

BDS to TSL handoff は、firmware が Boot Device Selection から Transient System Load に進む地点です。Boot Manager が boot option を選び、device path を connect し、LoadImage() で bootloader を load し、StartImage() を呼んで bootloader を実行します。

短く言うと、BDS to TSL handoff は、選ばれた boot option の .efi file を firmware が実行するタイミングです。

Firmware flow の中での位置

簡単な流れは次のようになります。

DXE
  Drivers and protocols are ready
BDS
  Read BootOrder, BootNext, Boot####
  Select boot option
  Connect device path
  LoadImage()
  StartImage()
TSL
  OS loader or boot application runs
  GetMemoryMap()
  ExitBootServices()
Runtime

BDS は OS loader ではありません。BDS は loader を選んで起動する firmware 側の処理です。TSL は、Boot Services がまだ存在している状態で loader が動いている段階です。

Boot option の中身

Boot#### には通常、次の情報があります。

Attributes
Description
Device Path
OptionalData or LoadOptions

Device Path は ESP と loader file を指します。たとえば次のような形です。

HD(...) / File(\EFI\Microsoft\Bootootmgfw.efi)
HD(...) / File(\EFI\BOOT\BOOTX64.EFI)

disk clone、SSD 交換、slot 変更、partition 編集などで Device Path が古くなると、BDS は正しい Boot#### を選んでいるように見えても、実際の file を見つけられないことがあります。

Device path の connect

file を load する前に、BDS は Device Path 上の controller を connect する必要があります。storage driver が bind していない、filesystem が出ていない、path に必要な node がない場合、別の方法では file が見えていても LoadImage()EFI_NOT_FOUND を返すことがあります。

失敗箇所は次のように分けます。

Boot#### は選ばれたか
Device Path はまだ正しいか
Controller は connect されたか
Simple File System は出たか
LoadImage は file を load できたか
StartImage は loader を実行できたか

LoadImage と StartImage は違う

LoadImage().efi file を読み、Secure Boot などの policy を確認し、image handle を作ります。StartImage() は、その image に制御を渡します。

失敗の意味も違います。

LoadImage fail: file path, filesystem, architecture, Secure Boot, image format を疑う
StartImage fail: loader は load されたが、自分で error を返したか早期 crash した可能性

log が単に “boot failed” だけで、LoadImageStartImage を分けていない場合、debug はかなり難しくなります。

よくある debug 例

実務では次のような問題があります。

BootOrder は正しい
Boot0001 は Windows Boot Manager
Shell では fs0: が見える
しかし machine は Setup に入る

この場合は次を確認します。

BootNext が通常順序を override していないか
Boot0001 の ACTIVE bit は残っているか
Boot0001 の Device Path は disk と partition GUID に合っているか
BDS はその path に対して ConnectController を呼んだか
LoadImage の status は何か
StartImage の status は何か
Secure Boot が image を reject していないか

Shell で fs0: が見えることは、Boot#### が正しいことを保証しません。Shell は現在見えている filesystem を map しますが、Boot#### は古い Device Path を使っている場合があります。

Source-reading checklist

BDS to TSL handoff の code を読むとき、私は次の順で見ます。

1. Variable: BootOrder, BootNext, Boot####
2. EFI_LOAD_OPTION: attribute, description, FilePathList, OptionalData
3. Device Path: HD node, FilePath node, full text output
4. ConnectController または ConnectDevicePath の path
5. Simple File System と file open
6. LoadImage status
7. StartImage status
8. Removable media の fallback boot path
9. Secure Boot または image verification log

まとめ

BDS to TSL handoff は、firmware が boot option を選び、bootloader を起動する部分です。boot fail を debug するときは、Boot#### の選択、Device Path の connect、LoadImage()StartImage() を分けて確認する必要があります。BootOrder や Shell の fs0: だけでは、多くの場合原因を特定できません。

この記事が役に立ったら

ファームウェア、BIOS/UEFI、組み込みシステムを学んでいる人に共有したり、作者を応援したりできます。

ご意見

Nội dung liên quan

Một số bài viết, ghi chú hoặc project có liên quan đến nội dung bạn vừa đọc.

Biến note thành bài viết hoàn chỉnh

Notes là nơi ghi nhanh khái niệm.