ファームウェアは何でも残してください。

ファームウェアは何でも残してください。

この質問をここに置くべきか、ここに置くべきかわかりません。reverseengineering.stackexchange.com

から引用ウィキペディア:

8086プロセッサでは、割り込みテーブルをInterrupt Vector Table(IVT)と呼びます。 IVTは常に0x0000から0x03ffの範囲のメモリ内の同じ場所にあり、256個の4バイトの物理モード遠距離ポインタ(256×4 = 1024バイトのメモリ)で構成されています。

qemuモニターで見つけたものは次のとおりです。

(qemu) xp/128xw 0
0000000000000000: 0xf000ff53 0xf000ff53 0xf000e2c3 0xf000ff53
0000000000000010: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
0000000000000020: 0xf000fea5 0xf000e987 0xf000d62c 0xf000d62c
0000000000000030: 0xf000d62c 0xf000d62c 0xf000ef57 0xf000d62c
0000000000000040: 0xc0005526 0xf000f84d 0xf000f841 0xf000e3fe
0000000000000050: 0xf000e739 0xf000f859 0xf000e82e 0xf000efd2
0000000000000060: 0xf000d648 0xf000e6f2 0xf000fe6e 0xf000ff53
0000000000000070: 0xf000ff53 0xf000ff53 0xf0006aa4 0xc0008930
0000000000000080: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
0000000000000090: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
00000000000000a0: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
00000000000000b0: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
00000000000000c0: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
00000000000000d0: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
00000000000000e0: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
00000000000000f0: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
0000000000000100: 0xf000ec59 0xf000ff53 0xf000ff53 0xc0006730
0000000000000110: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
0000000000000120: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
0000000000000130: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
0000000000000140: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
0000000000000150: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
0000000000000160: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
0000000000000170: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
0000000000000180: 0x00000000 0x00000000 0x00000000 0x00000000
0000000000000190: 0x00000000 0x00000000 0x00000000 0xf000ff53
00000000000001a0: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
00000000000001b0: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
00000000000001c0: 0xf000d611 0xf000ec4e 0xf000ec4e 0xf000ec4e
00000000000001d0: 0xf000d61a 0xf000d623 0xf000d608 0xf000ec4e
00000000000001e0: 0xf000ff53 0x00000000 0xf000ff53 0xf000ff53
00000000000001f0: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53

これらの価値をどのように理解するのか分かりません。割り込み記述子テーブルのようには見えません(値を逆参照すると、すべてのNULL値が提供されます)。それでは、私は正確に何を見ていますか?

ベストアンサー1

ファームウェアは何でも残してください。

SU Q&Aで説明したように、理想的な最新システムでは、プロセッサはリアルモードにはまったく入りません。最新の64ビットIntelチップPCはどのモードでブートセクタを実行しますか?、Johan Myréenが他の答えで指摘したように、物理メモリの最初のKiBは重要ではありません。しかし、多くの最新のファームウェアでは(まだ)互換性のサポート、意味は

  • 彼らは退くことができます(例えば、後ろに、MBR、VBRのレガシーPC / ATブートローダなど、リアルモード用に作成されたシステムソフトウェアを実行するために仮想モードから保護モードに直接移動することを検討してください。
  • これらは以前のリアルモードファームウェアAPIを提供し、これらのAPIに上記のシステムソフトウェアが依存するすべてのデータ構造を確立します。

これらのデータ構造の1つはリアルモードIVTです。以前のリアルモードファームウェアAPIはint命令に基づいており、リアルモードIVTは初期化の一環として、その命令へのさまざまなファームウェア処理ルーチンへのポインタでファームウェアで埋められました。

保護モードシステムソフトウェアは古いリアルモードファームウェアAPIを必要とせず、リアルモードでプロセッサを実行しないため、物理メモリの最初の1KiBのリアルモードIVTは使用されません。 (v8086 保護モードはアドレスを指定しません。物理住所は00000000以上なので、ぜひ覚えてください。解決しました論理的00000000以上のアドレスはページテーブルによって変換されます。 )最新のEFIシステムでは、ファームウェアは物理メモリのメモリマップをオペレーティングシステムのブートローダに渡し、ファームウェアが自己保護モードAPI目的で使用するために予約されている部分を通知し、オペレーティングシステムは引き続き自由に使用できます。物理メモリプールのどの部分ですか?理論的には、物理​​メモリの最初のページは後者のカテゴリに属する​​ことができます。

実際、ファームウェアは通常、物理メモリの最初のページを「ブートサービスコード」と表示します。これはオペレーティングシステムですできるこれを宣言し、引き続き物​​理メモリプールの一部として使用します。しかしその後EFIファームウェアの起動時間サービスはオペレーティングシステムによってオフになり、ファームウェアはランタイムサービスのみを提供するように縮小されます。add_efi_memmapこれの例は、Finnbarr P. Murphyによって示されたLinuxカーネルログ(オプションを含む)にあります。

[0.000000] efi: mem00: タイプ=3, attr=0xf, 範囲=[0x0000000000000000-0x0000000000001000) (0MB)
xeは他のプログラムを使用してより理解しやすい形式でデコードされ、次のことを行います。

[#00] タイプ: EfiBootServicesCode プロパティ: 0xF
      物理学: 00000000000000000-0000000000001000
      仮想: 00000000000000000-0000000000001000

第二に、実際には、Linuxはこれらの物理メモリ範囲を明示的に無視します。〜でもファームウェアには引き続き使用できると記載されています。 EFIファームウェアと非EFIファームウェアの両方で、Linuxは物理メモリマップがある場合はそれをパッチします(という関数ではtrim_bios_range)、次のカーネルログメッセージを生成します。

[0.000000] e820:アップデート[mem 0x00000000-0x00000fff]有効==>予約済み

これは、リアルモードIVTがファームウェアAPIの一部ではなく最新のEFIファームウェアを処理するのではなく、ファームウェアAPIの一部ですが、ファームウェアがそれを報告する以前のPC98ファームウェアを処理するためのものです(次の同じAPIを介して)。物理メモリ)オペレーティングシステムで簡単に上書きできます。

したがって、物理メモリの理論的範囲はできるカーネルメモリアロケータと要求ページング仮想メモリの一時的な要求に応じて、任意のコードまたはデータが含まれています。実際、Linuxはファームウェアが最初に設定されているため、これを変更しません。

システムのファームウェアは、システムをリアルモードのIVTエントリで満たしました。もちろん、リアルモードIVTエントリは16:16の遠距離ポインタです。 2バイトの16進ダンプを使用してメモリーを表示すると、実際にこれを非常に明確に表示できます。いくつかの例:

  • ほとんどのIVTエントリは、リアルモードファームウェアROM領域のアドレスF000:FF53を指します。実行のみの仮想ルーチンにすることもできますiret
  • IVTはじめに1E同じROM領域にあるテーブルF000:6AA4を指します。
  • IVT入口1階リアルモードビデオROMファームウェア領域のテーブルであるC000:8930を指します。
  • IVT項目43リアルモードビデオROMファームウェア領域の別のテーブルであるC000:6730を指します。

追加読書

おすすめ記事