BIOS firmwareにおけるSPI Flashとは
BIOS firmwareのSPI Flash、flash chip、descriptor、regions、BIOS Region、NVRAM、FV layout、update flow、image取り違えのdebugを整理します。
SPI Flashは、platform firmwareを保存するnon-volatileなflash chipです。BIOS/UEFI code、NVRAMまたはvariable store、flash layout情報、platformによってはMEやGbEのregionも含まれることがあります。
「BIOSをflashする」と言うとupdate fileだけを思い浮かべがちですが、firmware debugでは、SPI flash chip、full SPI image、Flash Descriptor、BIOS Region、Firmware Volume、UEFI variable storeを分けて考える必要があります。
SPI Flashには何が入るのか
多くのPC/embedded x86 platformでは、SPI Flashはいくつかのregionに分かれます。
| Region | 役割 | 問題になる例 |
|---|---|---|
| Flash Descriptor | region layoutとaccess permissionを定義する | toolが書けない、またはoffsetを間違える |
| BIOS Region | 主なUEFI firmwareを含む | 違うregionを書いてfirmwareが変わらない |
| ME/TXE Region | management engine firmware | 別boardからcopyしてplatform挙動が壊れる |
| GbE Region | MACやNIC関連data | MAC addressやnetwork設定が失われる |
| NVRAM/Variable Store | UEFI variablesを保存する | BootOrder、Setup、Secure Boot keyが消える、または壊れる |
| OEM/Platform Data | vendor固有のboard data | full imageを誤って書いてfactory dataを失う |
すべてのplatformがこれらを持つわけではありません。ARMやembedded platformでは別layoutの場合もあります。それでも、fileがfull imageなのか、region imageなのか、capsuleなのかを識別するという考え方は同じです。
SPI Flashからfirmware moduleまで
SPI flash chip
board上のnon-volatile storageです。
Flash Descriptor
region mapとaccess permissionを定義します。
BIOS Region
主なUEFI firmwareを保持します。
Firmware Volume
FFS Fileを入れるcontainerです。
FFS File
firmware moduleまたはdata fileです。
FFS Section
PE32、TE、DEPEX、RAW、UIなどのsectionです。
full SPI image、BIOS region image、capsuleの違い
| 種類 | 通常含むもの | リスク |
|---|---|---|
| Full SPI image | Descriptorと複数region | board固有dataを上書きする可能性がある |
| BIOS Region image | BIOS Regionのみ | toolがfull imageを期待しているとoffsetが合わない |
| Capsule/update package | 署名やwrapper付きのupdate payload | raw region imageとして直接flashできない |
| FV image | 1つのFirmware Volume | BIOS Region内の一部にすぎない |
| FFS File | 1つのmoduleまたはdata | そのままflashするimageではない |
.binや.capを受け取ったとき、最初に確認すべきなのは、そのfileがどの階層のimageなのかです。
flash範囲を間違えたときの典型例
実際によくある問題は次の通りです。
- flash toolはsuccessを返すが、boardは古いfirmwareのまま動く。
- BIOS Region imageをfull SPI imageとして扱ってしまう。
- 別boardのfull imageを書いて、MAC、serial、board ID、calibration dataを失う。
- BIOS updateがNVRAMをpreserveするため、古いBootOrderやSetup問題が残る。
- capsuleをrawでflashして、platformが正しく認識できない。
- Descriptorやprotected rangeが書き込みを止めているが、tool logが曖昧。
実際のdebug例: flash成功なのにversionが変わらない
vendor toolまたはprogrammerでfileを書き込み、toolはsuccessを返しました。しかしBIOS Setupでは古いversionが表示されたままです。
この場合は次の順で確認します。
- fileがcapsule、BIOS region、full SPI imageのどれかを確認する。
- flash後にSPI Flashをread backし、byte levelで比較する。
- 書き込みoffsetがBIOS Regionに合っているか確認する。
- Descriptor access、BIOS lock、protected rangeが書き込みを止めていないか確認する。
- dual BIOS、backup bank、recovery bankがあるplatformか確認する。
- BIOS Setupがversion stringをどのFVまたはvariableから読んでいるか確認する。
- updateがNVRAMをpreserveする場合、version stringがcode側かvariable側か確認する。
sourceやtool logで見るべきこと
SPI Flash debug checklist
securityの観点
SPI FlashにはOSより前に実行されるcodeとpolicyが入っています。region protectionが緩すぎると、buggyなtoolや攻撃者がBIOS RegionやNVRAMを書き換えられる可能性があります。一方、lock policyが早すぎたり厳しすぎたりすると、正当なupdateが失敗します。update flow、SMM write path、descriptor permission、protected rangeをまとめて確認する必要があります。
まとめ
SPI Flashはfirmwareの物理的な保存先ですが、その中には複数の論理layerがあります。BIOS updateやfirmware imageのdebugでは、full SPI、BIOS Region、FV、FFS、capsuleのどれを扱っているのかを最初に確認しましょう。多くの「flashが効かない」問題は、imageの階層や書き込みregionの取り違えから起きます。
この記事が役に立ったら
ファームウェア、BIOS/UEFI、組み込みシステムを学んでいる人に共有したり、作者を応援したりできます。
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.