BDS to TSL Handoffとは?
BIOS/UEFIのBDS to TSL handoffを説明します。BootOrder、Boot####、Device Path、ConnectController、LoadImage、StartImageを扱います。
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” だけで、LoadImage と StartImage を分けていない場合、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.
UEFIのBDSとは
BDSはDXEの後にブートオプションを選ぶフェーズである。ファームウェアはBootOrderを読み、デバイスを接続し、EFI imageをロードして起動する。BDSを理解すると誤ったブートオプションのデバッグに役立つ。
TSLとは何か
UEFIのTSLを、OSローダーの実行、Boot Servicesの利用、ExitBootServices準備という流れで説明します。
Boot####、BootOrder、BootNextとは
Boot####はNVRAM内のEFI_LOAD_OPTIONであり、attributes、Device Path、optional dataを保持する。BootOrderとBootNextはBDSが試す順序を制御する。
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.