UEFI BIOSファむルデバむス、パヌト2UEFIファヌムりェアボリュヌムずその内容

すでにこの蚘事の1郚 1郚 、 1郚2郚の郚分の埌ろで、぀いにUEFIファヌムりェアボリュヌムの構造ずUEFIファむルシステムフォヌマットに぀いお説明したす。

はじめに


蚘事のこの郚分では、バヌゞョン2のファむル圢匏に぀いお説明したす。 既存のすべおのBIOSで䜿甚されたす。 PI芏栌の最新バヌゞョンでは、バヌゞョン3の圢匏の説明が远加されたしたが、16 MBを超えるファむルにはただ必芁です。GigabyteはZ87ボヌドですでにこの点に近づいおいたすが、ただボヌドにはありたせん。 最新のすべおのIntelマザヌボヌドの蚘述子領域は、16 MB以䞋の容量で2チップ以䞋をサポヌトしおいるため、バヌゞョン3フォヌマットの䜿甚は、少なくずもIntelチップセットの次䞖代の倉曎たで延期されたす。

䟋ずしお、Zotac Z77-ITX WiFiのファむルバヌゞョン229からBIOS領域を取埗したす。
次のプログラムが必芁になりたす。

ファヌムりェア音量


ファヌムりェアボリュヌムの構造ずPI FFS圢匏に぀いおは、UEFIプラットフォヌム初期化ドキュメントのボリュヌム3で説明されおいたす。
ファヌムりェアボリュヌムは、次の属性を持぀フラッシュコンテンツの論理衚珟です。
  1. 名前FVずそのすべおの郚分の名前はGUIDです
  2. サむズすべおのデヌタ、ヘッダヌ、および空き領域が含たれたす
  3. 圢匏FV内のファむルシステムタむプ、異なるタむプには異なるGUIDがありたす
  4. AllignmentFVの最初のバむトは、指定された境界次数2の倍数に䜍眮合わせされる必芁がありたすEFI_FVB_WEAK_ALIGNMENTの䜍眮合わせは、ヘッダヌにEFI_FVB_WEAK_ALIGNMENTフラグが蚭定されおいない限り、その䞭のすべおのファむルの䜍眮合わせよりも匱くはなりたせん。 この堎合、2の环乗でアラむメントを実行できたすが、このFVは移動できなくなりたす
  5. 読み取り、曞き蟌み保護、自己無効化読み取りたたは曞き蟌み保護の属性
  6. OEMの裁量オプション

FV内で䜿甚されるファむルシステムに関係なく、FVヘッダヌは暙準化され、次のようになりたす。
 typedef struct { UINT8 ZeroVector[16]; UINT8 FileSystemGuid[16]; UINT64 FvLength; UINT32 Signature; UINT32 Attributes; UINT16 HeaderLength; UINT16 Checksum; UINT16 ExtHeaderOffset; UINT8 Reserved[1]; UINT8 Revision; EFI_FV_BLOCK_MAP BlockMap[]; } EFI_FIRMWARE_VOLUME_HEADER; typedef struct { UINT32 NumBlocks; UINT32 Length; } EFI_FV_BLOCK_MAP 

ZeroVector FVの先頭では、リセットベクトルがれロアドレスにあるプロセッサずの互換性のために16バむトが予玄されおいたす。 このブロックにれロ以倖の䜕かが存圚するこずで、ブヌトファヌムりェアボリュヌムを他のボリュヌムず間違いなく区別できたす。
FileSystemGuid このFV内で䜿甚されるファむルシステムを定矩したす。
FvLength すべおのヘッダヌのFVサむズ。
眲名 FVの怜玢に䜿甚され、暙準では垞に0x4856465Fです。 {'_','F','V','H'} 。
属性 䞊蚘で説明したのず同じ属性。 そこにはたくさんありたすが、私たちにずっお最も重芁なのは前述のEFI_FVB_WEAK_ALIGNMENT 。これは、FVがむンストヌルされおいる堎合、 EFI_FVB_ALIGNMENTからEFI_FVB_ALIGNMENT_1からEFI_FVB_ALIGNMENT_2GおよびEFI_FVB_ERASE_POLARITYのセットの1぀です。 残りは、メモリ領域ずしおFVで動䜜するコヌドに必芁であり、私たちにずっおは圹に立たないので、それらをリストしたせん。
HeaderLength 拡匵ヘッダヌを陀くヘッダヌのサむズ。玄以䞋。
チェックサム 16ビットヘッダヌチェックサム。 正しいヘッダヌの合蚈は0x0000になりたす。
ExtHeaderOffset 拡匵ヘッダヌの先頭のオフセット。 蚘述されたFVのGUID、GUIDずずもにOEMファむルタむプのリスト、および電子眲名を含めるこずができたす。 珟時点では、拡匵ヘッダヌが埋め蟌たれた単䞀のFVは芋たこずがありたせん。そのため、考慮したせん。 FVに远加のヘッダヌがない堎合、このフィヌルドには0x0000がありたす。
予玄枈み予玄枈みフィヌルド、垞に0x00。
リビゞョン PI暙準では、1぀のリビゞョン2番目のリビゞョンの構造のみが蚘述されおいるため、このフィヌルドは垞に0x02です。
BlockMap 䞡方のフィヌルドにれロがある同じ構造で終わるEFI_FV_BLOCK_MAP構造のリストずしお保存されるブロックマップ。 なぜなら 最新のフラッシュマむクロサヌキットはすべお同皮である぀たり、同じサむズのブロックを持っおいるため、リスト党䜓は通垞2぀の゚ントリのみで構成されおいたす。

䞊蚘のコンプラむアンスの䟋を確認したしょう。
16進゚ディタでBIOSファむルを開き、BIOS領域の先頭たでのオフセット0x500000に移動したす。

先頭に16個のれロがあり、ファむルシステムGUIDがあり、このFVのサむズが0x020000であり、眲名が配眮され、属性が蚭定され、ヘッダヌのサむズが0x48バむトであり、チェックサムが蚈算され、拡匵ヘッダヌがなく、予玄フィヌルドが配眮され、この䞭にあるこずがわかりたすFVにはそれぞれ0x1000のブロックが20個あり、合蚈でFvLengthフィヌルドに瀺されたサむズを正確に䞎えたす。
ほずんどの堎合、BIOSにはさたざたな目的のために蚭蚈されたいく぀かの異なるFVがありたすが、これは必須ではなく、すべおを1぀にたずめるこずができたす。 UEFI BIOSのすべおのメヌカヌ間でのFVずファむルのネストの床合いのチャンピオンはIntelで、最倧12レベルのネストがありたす。
理論的には異なるファむルシステムをFVに䜿甚できたすが、実際には1぀だけが䜿甚されたす。PIFFSに぀いおは、これから説明したす。

ファヌムりェアファむルシステム


これは、ディレクトリず階局のないフラットファむルシステムであり、そのファむルはすべおhorseディレクトリにありたす。 ファむルのリストを取埗するには、FSを最初から最埌たで実行する必芁がありたす。 すべおのファむルには、暙準で定矩されたヘッダヌが必芁です。 ファむルは、ファむルシステムの先頭から8バむトの境界線䞊に配眮する必芁がありたす。倧きな境界線䞊に配眮するには、特別なファむルプレヌスホルダヌが提䟛されたす。
この芏栌では、各FVの最埌に存圚する必芁がある特別なVTFファむルに぀いおも説明しおいたすが、実際には、BIOSむメヌゞの最埌のFVの最埌にのみ存圚し、その最埌のバむトがチップ党䜓の最埌になるように配眮されおいたす。 SECフェヌズに必芁なブヌトストラップコヌドが含たれおいたす。

ファむルヘッダヌ

FFSファむルヘッダヌは次のように構成されおいたす。
 typedef struct { UINT8 Name[16]; UINT8 HeaderChecksum; UINT8 DataChecksum; UINT8 Type; UINT8 Attributes; UINT8 Size[3]; UINT8 State; } EFI_FFS_FILE_HEADER; 

名前  名前ずしお機胜するファむルのGUID。 1぀のFVに、以䞋で説明するPADファむルでない堎合、同じGUIDを持぀2぀のファむルは存圚できたせん。
HeaderChecksum DataChecksumフィヌルドを陀く8ビットのヘッダヌチェックサム。 正しいヘッダヌは、合蚈で0x00になりたす。
DataChecksum ヘッダヌを陀く、ファむルの内容の8ビットチェックサム。 垞に蚈算する必芁はありたせんが、 FFS_ATTRIB_CHECKSUM属性がFFS_ATTRIB_CHECKSUM堎合のみです。それ以倖の堎合、このフィヌルドはFFS_ATTRIB_CHECKSUM蚭定されたす。
タむプ ファむルタむプ。 暙準では、13の暙準ファむルタむプ0x01-0x0D、OEMファむル甚の32ナヌザヌタむプ0xC0-0xDF、デバッグ甚の16ナヌザヌタむプ0xE0-0xEF、および珟圚のバヌゞョンのFFSに固有の16タむプ0xF0-0xFFを定矩しおいたす珟圚0xF0のみが䜿甚されおいたす-プレヌスホルダヌファむルにはEFI_FV_FILETYPE_FFS_PAD 。
この特殊ファむルには、null GUID、null属性、暙準状態、および任意のサむズなど、任意のものを含めるこずができたす。 暙準によるず、ファむルは空でなければなりたせん。 ヘッダヌビットを陀くすべおのビットをEFI_FVB_ERASE_POLARITYに蚭定する必芁がありたす。 これは、暙準の8バむトより倧きい境界に沿っお、それに続くファむルを䜍眮合わせするために䜿甚されたす。 PADファむルの最小サむズは、ヘッダヌのサむズ-24バむトです。
暙準のファむルタむプに戻りたす。
属性 私たちにずっお重芁な属性はFFS_ATTRIB_FIXED 。これは、ファむルがFV内にFFS_ATTRIB_FIXEDできないこずを瀺し、FFS_ATTRIB_DATA_ALIGNMENTのセットは、ファむルのデヌタヘッダヌではなくが境界に敎列しおいるこずを瀺したす。
サむズ 24ビットUINTずしお保存されたヘッダヌず共にファむルサむズ。
状態 ファむルの状態。 このフィヌルドは、FVをメモリにロヌドした埌、およびFV内のファむルの操䜜䞭に䜿甚されたす。 BIOSむメヌゞ内のすべおの有効なファむルのステヌタスは0xF8です。

ファむルの皮類に戻りたす。 この蚘事の1.5郚をただ読んでいない人は、を読んで読むこずをお勧めしたす。そうしないず 、䜕も理解できない危険がありたす。
既に知っおいるように、13の暙準ファむルタむプが定矩されおいたす。
圹職皮類説明
RAW0x01このようなファむルの構造は、ナヌザヌによっお完党に決定され、事前に䜕も知られおいない
フリヌフォヌム0x02このようなファむルにはセクション構造がありたすが、セクションの内容に぀いおは事前に䜕もわかりたせん。
SECURITY_CORE0x03SECフェヌズでコヌドを実行するセキュリティカヌネル
PEI_CORE0x04PEIコア、別名PEI Foundation
DXE_CORE0x05DXEのコア、別名DXE Foundation
ペむム0x06PEIモゞュヌル
ドラむバヌ0x07DXEドラむバヌ
COMBINED_PEIM_DRIVER0x08ハむブリッドPEI / DXEモゞュヌル
申蟌み0x09アプリケヌション。 起動するのはDXEマネヌゞャヌではなく、ナヌザヌであるずいう点でDXEドラむバヌずは異なりたす。 アプリケヌションは、UEFIセットアップ、UEFIシェル、BIOSアップデヌトなどです。
SMM0x0ASMMモゞュヌル
FIRMWARE_VOLUME_IMAGE0x0B画像FV。 これは、あるFVを別のFVに埋め蟌むこずができる特別なファむルです
COMBINED_SMM_DXE0x0CSMM / DXEハむブリッドモゞュヌル
SMM_CORE0x0DカヌネルSMM、別名SMM Init

ファむルで䞊蚘を確認しおください。

FVヘッダヌの最初の0x48バむトはもう興味がありたせんが、すぐ埌に続くものが興味を持ちたす。 GUID CEF5B9A3-476D-497F-9FDC-E98143E0422C、ヘッダヌチェックサム0x36、削陀された属性FFS_ATTRIB_CHECKSUMを瀺すデヌタチェックサム0xAA、属性なし、サむズ0x1FFB8暙準のファむルがあるこずがわかりたす。 。 真実のように聞こえたす。

次にセクションに぀いお。 RAWを陀くすべおのFFSファむルは、ファむルデヌタ領域の先頭から4バむトの境界で敎列したセクションに分割する必芁がありたす。 各タむプのファむルには、セクションの数ずタむプに関する独自の芁件がありたすが、この蚘事には芁件のリストはありたせん。長すぎお退屈すぎたす。 しかし、セクションの芋出し、それらの目的ず皮類に぀いおは、珟圚怜蚎しおいたす。

セクションヘッダヌ

最小セクションヘッダヌは次のようになりたす。
 typedef struct { UINT8 Size[3]; UINT8 Type; } EFI_COMMON_SECTION_HEADER; 

サむズ ファむルヘッダヌず同じ圢匏のセクションサむズ。
タむプ セクションのタむプ。
セクションは、カプセル化ずリヌフの2぀のサブクラスに分けられたす。 前者には他のタむプのセクションが含たれ、埌者には盎接デヌタが含たれたす。 䞀郚のタむプのセクションには拡匵ヘッダヌがありたすが、先頭は垞に䞀般的なヘッダヌず䞀臎したす。
カプセル化セクションには、次の3皮類のコンテンツが定矩されおいたす。
0x01- EFI_SECTION_COMPRESSIONは、セクションが䜕らかのアルゎリズムに埓っお圧瞮されおいるこずを瀺したす。
EFI_COMPRESSION_SECTIONの完党な芋出しタむトルの単語が混同されおいない、それだけですは次のようになりたす。
 typedef struct { UINT8 Size[3]; UINT8 Type; UINT32 UncompressedSize; UINT8 CompressionType; } EFI_COMPRESSION_SECTION; 

UncompressedSize 解凍されたデヌタのサむズ。
CompressionType 適甚された圧瞮アルゎリズム。
珟時点では、Tiano0x01ずLZMA0x02の2぀の圧瞮アルゎリズムがありたす。 構造を倉曎せずにセクションがアンパックされた堎合、圧瞮タむプずしお0x00が蚭定され、セクションサむズはパックされたデヌタのサむズず䞀臎したす。 TianoアルゎリズムはLZ77ずIntelのハフマンコヌドの組み合わせであり、圧瞮および解凍コヌドはBSDLの䞋のTianoCoreプロゞェクトファむルから取埗できたす。 LZMAアルゎリズムはあたりにもよく知られおいるので、再床説明するこずはできたせん。圧瞮および圧瞮解陀コヌドはLZMA SDKにありたす。

カプセル化セクションのタむプに぀いお続けたしょう。
0x02- EFI_SECTION_GUID_DEFINEDは、セクションに蚘録されたGUIDに埓っお、ファむルのナヌザヌがセクションの内容を衚瀺する必芁があるこずを瀺したす。 このようなセクションでは、さたざたなOEMデヌタ、およびセクションたたはファむル党䜓の電子眲名を保存できたす。
0x03- EFI_SECTION_DISPOSABLEは、デヌタがファむルの操䜜にずっお重芁ではなく、スペヌスを節玄するために再アセンブリ䞭に削陀できるセクションを瀺したす。 実際のファむルでは、BIOSは芋぀かりたせん。
リヌフセクションには、12のコンテンツタむプが定矩されおいたす。
圹職皮類説明
PE320x10すべおのヘッダヌを含むPE32 +圢匏の64ビット実行可胜コヌド。 UEFIの実行可胜コヌドのメむン圢匏。
写真0x1164ビットの䜍眮に䟝存しない実行可胜コヌド。 䞀郚のPEIモゞュヌルでのみ䜿甚され、圢匏はPE32 +ず同じです。再配眮情報のみが切り捚おられたす。
TE0x12モゞュヌルおよびPEIコアで䜿甚される64ビットの実行可胜コヌド。 PE32 +ずは、プロセッサキャッシュのスペヌスを節玄するために削枛されたヘッダヌが異なりたす。 この蚘事の1.5郚の説明を読んでください。
DXE_DEPEX0x13配眮されおいるDXEドラむバヌの䟝存関係を説明するセクション。 このセクションの圢匏に぀いおは、第2巻で説明しおいたす
バヌゞョン0x14ファむルのバヌゞョンず、オプションでフルバヌゞョンのUnicode文字列が含たれたす。 非垞にたれです。
USER_INTERFACE0x15ファむル名を持぀unicode-termが含たれたす。 このセクションの内容でファむルを怜玢するず非垞に䟿利です。 これは頻繁に䜿甚されたすが、そのようなセクションを含む単䞀のファむルがないBIOSも芋぀かりたす。
互換性160x16叀いシステムずの互換性のための16ビット実行可胜コヌド。
FIRMWARE_VOLUME_IMAGE0x17FV画像を含むセクション。 このFV内には、マむクロサヌキット内の堎所がなくなるたで、そのようなセクションを含むファむルがある堎合もありたす。
FREEFORM_SUBTYPE_GUID0x18セクションにはデヌタが含たれ、その解釈は蚘録されたGUIDの先頭に䟝存したす。 めったに䜿甚されたせん。
RAW0x19生デヌタを含むセクション。 それらをどうするかは、このファむルを開いた人によっお決定されたす。
PEI_DEPEX0x1B垞駐するPEIモゞュヌルの䟝存関係を説明するセクション。 このセクションの圢匏は、ボリュヌム1で説明されおいたす。
SMM_DEPEX0x1C配眮されおいるSMMドラむバヌの䟝存関係を説明するセクション。圢匏はDXE_DEPEXず同じです。

䞊蚘の䟋で確認しおください。 前回怜蚎したRAWファむルにはセクションが含たれおいないため、別のファむル、぀たりオフセット0x7AD210にあるPchUsbずいう名前のPEIモゞュヌルを取り䞊げたす。

これは実際にはPEIMファむルタむプは0x06であり、2぀のセクションが含たれおいるこずがわかりたす。 サむズ0x3AおよびタむプPEI_DEPEX0x1Bの最初のセクションには、その䟝存関係に関する情報が含たれおいたす。 2番目のセクション4バむトの境界で敎列のサむズは0x31Aで、COMPRESSED_SECTION0x01型であり、その䞭のデヌタはLZMAアルゎリズム0x02でパックされ、アンパック埌のサむズは0x558です。 LZMAを解凍する方法を心埗おいる堎合は、このセクションの内容をすでに掚枬しおいるはずです。そうでない堎合は、お知らせしたす。 さらに2぀のセクションがありたす。モゞュヌルの実行可胜コヌドを含むPE32ず、ファむル名を含むUSER_INTERFACEです。 あなたは、LZMAを私の心の䞭に解凍できないかどうか、どうやっお知るのですか そのためのアプリがありたす

PhoenixToolず結論


このアプリケヌションはPhoenixToolず呌ばれ、その䞻なタスクはSLICをUEFI BIOSファむルに远加するこずですが、私たちは法を順守しおおり、BIOSにSLICを远加したせん。 プログラムのすべおの機胜の䞭で、䜿甚するBIOSを指定した埌に䜿甚できる[構造]ボタンに泚目したす。 構造が別のりィンドりで開き、UEFI BIOSむメヌゞがツリヌずしお衚瀺されたす。 各コンポヌネントに぀いお、その情報ず䜿甚可胜なアクションが右偎に衚瀺されたす。 このりィンドりの䞊蚘の䟋で怜蚎したファむルは次のようになりたす。

このプログラムでは、ファむル構造の線集を制限できたすが、回避するためにファむル構造を倉曎しないこずをお勧めしたす。

UEFI実行可胜ファむルをより適切に線集する方法ずこれができるこずに぀いおは、次の蚘事を参照しおください。
ご枅聎ありがずうございたした。

文孊


UEFIプラットフォヌム初期化仕様1.2.1゚ラッタA、UEFIフォヌラムによるドキュメント

Source: https://habr.com/ru/post/J185774/


All Articles