ブートROMは、コンピュータシステムの起動に使用される読み取り専用メモリ(ROM)です。 [1] CPUがリセットベクターにリセットされた後に実行される命令が格納されており、通常はブートローダをロードします。ブートROMには、後から変更できないマスクブートROMと、 EEPROMやフラッシュメモリチップ などの書き込み可能なブートROMの2種類があります。
電源投入時、ハードウェアは通常、初期化されていない状態で起動します。起動を続行するには、システムは周辺機器(通常はデータストレージデバイス)からブートローダを読み取る必要がある場合があります。外部ストレージデバイスからの読み取りルーチンは、ハードウェアよりもソフトウェアで実装する方が簡単な場合が多くあります。ブートROMは、この初期読み込みコードを、実行開始時にプロセッサがすぐにアクセスできる固定位置に格納する場所を提供します。
ブートROMはメモリ上の固定位置にマッピングされており、プロセッサはリセット後、プロセッサのリセットベクターに従ってこの位置から実行を開始するように設計されています。ブートROMはCPUと同じダイ上に配置されるか、外付けROMチップとして配置されます。最近のシステムでは、ブートROM(CPUに統合されているか外付けROMチップであるかに関係なく)は通常、インプレース実行をサポートするNORフラッシュメモリを使用しています。
ブートROMは、起動に必要なハードウェアバスと周辺機器を初期化します。場合によっては、ブートROMがDRAMを初期化できることもありますが、ブートローダが初期化を行う場合もあります。 [要出典]一部の最新のARM CPUでは、CPUに統合されたブートROMがDRAMを初期化してからブートローダをロードします。ただし、ブートローダ( Das U-Bootなど)がロードされた後、バグ修正やコスト削減のため、ブートローダがDRAMを再初期化することがあります。
ハードウェア初期化の最後に、ブート ROM は外部周辺機器 (ハードディスク ドライブやソリッド ステート ドライブ、eMMCまたはeUFSカード、microSDカード、外部 EEPROM など) から、または通信ポート (シリアル ポートやEthernetなど)上の特定のプロトコルを通じてブートローダをロードしようとします。
多くのシステムオンチップ(SoC)では、ブートROMがブートローダーをロードしようとする周辺機器やバス、およびそれらのロード順序を設定できます。この設定は、システムオンチップ内の電子ヒューズを飛ばしてその情報をエンコードするか、システムオンチップの特定のピンまたはジャンパーをハイまたはローに設定することで実現できます。
一部のブートROMはブートローダーのデジタル署名をチェックすることができ、署名が有効でない場合、または承認された鍵で署名されていない場合はブートローダーの実行を拒否し、ブートを停止します。一部のブートROMでは、署名の検証に必要な公開鍵のハッシュがSoC内部のOTP 電子ヒューズにエンコードされています。一部のシステムオンチップブートROMは公開鍵インフラストラクチャもサポートしており、認証局(CA)の公開鍵のハッシュが電子ヒューズにエンコードされています。これにより、ブートROMはCAの公開鍵(そのハッシュは電子ヒューズにエンコードされています)と検証することで、ブートローダーが承認された鍵で署名されているかどうかを確認できます。[2] [3]
この機能は、セキュリティ機能を実装したり、信頼チェーンにおけるハードウェアの信頼のルートとして使用したりできますが、一度設定すると、ユーザーはブートROMエクスプロイトを使用せずにブートローダーを任意のものに置き換える自由がなくなります。そのため、この機能はフリーソフトウェアコミュニティから強い懸念を引き起こしています。[4]
ブートローダにジャンプする直前に、チップ上の一部のシステムはメモリマッピングからブートROMを削除しますが、他のシステムは削除しないため、後で分析するためにブートROMをダンプすることができます。[3]ブートROMにまだアクセス可能な場合、ブートローダはブートROMのコードを呼び出すこともできます(これは文書化されている場合があります)。
システムオンチップ(SoC)がサスペンド・トゥ・RAMモードに入ると、多くの場合、プロセッサは完全にオフになり、RAMはセルフリフレッシュモードになります。復帰時にはブートROMが再度実行されますが、多くのブートROMはSoCがサスペンド・トゥ・RAMモードに入っていたことを検出し、カーネルに直接ジャンプして復帰できます。カーネルは、オフになっていた周辺機器の電源を再びオンにし、コンピュータを以前の状態に復元します。
多くのAllwinnerチップ搭載システム(A10、A20、A64)では、ブートROMはUSB経由でブートローダがロードされるのを待つか(特定のPINがハイの場合)、複数の周辺機器で固定された順序でブートを試みます。[5]
一部のAllwinnerシステムオンチップは、ブートローダーの署名を検証できます。[6]しかし、現在製造されているデバイスのほとんどは、そのように設定されていません。そのため、フリーソフトウェアやオープンソースソフトウェアによって、多くのAllwinnerシステムオンチップや、U-Bootなどのブートローダーでそれらを使用するデバイスへのサポートが追加されました。[7]
iPhone、iPad、Apple Watch、iPod Touch、Apple TVデバイスでは、ブートROMは「SecureROM」と呼ばれます[8] 。これはiBootの簡素化されたバージョンであり、デバイスファームウェアアップグレード(DFU)メカニズムを提供し、特別なボタンの組み合わせで起動できます[9] 。
NXPシステムオンチップ(SOC)のブートROMは、システムオンチップの特定のピンを介して周辺機器の設定をサポートします。i.MX6ファミリーでは、eFuseを介してブート順序の設定もサポートします。
いくつかの NXP SoC のブート ROM には、第 1 段階のブートローダをロードする方法が多数あります(eMMC、microSD、USB などから)。
NXPのSoCの中には、ブートローダの署名検証を設定することができるものがあります。こうしたSoCを搭載した多くのデバイスは、この検証が設定されていない状態で販売されており、ユーザーはこれらのデバイスに、Das U-Boot [10]やBareboxといったフリーのオープンソースソフトウェア ブートローダなど、任意のブートローダをインストールすることができます。
テキサス・インスツルメンツ社製のいくつかのシステム・オン・チップ(SOC)のブートROMは、SOCの特定のピンを介して周辺機器の設定をサポートしています。これらのシステム・オン・チップには、第一段階ブートローダ(SOCのリファレンスマニュアルではMLOと呼ばれています)をロードする方法が複数あります。
OMAP36xxシステム・オン・チップでは、ブートROMは第一段階のブートローダをセクター0x0と0x20000(128KB)から探します。[11] AM3358システム・オン・チップでは、[12]加えてセクター0x40000(256KB)と0x60000(384KB)も探します。どちらの場合も、最大サイズは128KBです。これは、(第一段階の)ブートローダがシステム・オン・チップ内部の SRAMにロードされるためです。
OMAPおよびAM335xシステムオンチップは、ブートローダの署名検証を行うように設定できます。このようなシステムオンチップを搭載した多くのデバイスは、検証が設定されていない状態で販売されており、ユーザーはこれらのデバイスに、Das U-Boot [13]、Coreboot [14]、Bareboxといったフリーでオープンソースのソフトウェアブートローダなど、任意のブートローダをインストールできます。
STマイクロエレクトロニクスのSTM32ファミリーマイクロコントローラは、システムメモリ[15]と呼ばれる組み込みROM(「オンチップROM」とも呼ばれる)を搭載しており、空のシステムフラッシュを容易にします。特定のピンの組み合わせ、あるいは場合によってはeFUSEや空のフラッシュチェックによって、チップはメインフラッシュ内のファームウェアではなくROMからブートするように強制されます。これにより、ハードウェアプログラミングインターフェースに頼ることなく、空のチップをフラッシュすることが可能になります。技術的には、このROMはフラッシュアレイの専用領域に格納され、製造時にSTによってプログラムされます。ほとんどのSTM32マイクロコントローラは、少なくともUART経由でフラッシュ書き込みが可能で、一部はUSBをサポートし、最終的にはI2C、SPI、CANなどの他のインターフェースもサポートします。Cortex -Mコアは通常、既知のアドレス0x00000000(スタックポインタの初期値)と0x00000004(プログラムカウンタの初期値)からベクトルを取得します。ただし、これらのアドレスにマッピングされるメモリは、ピンやヒューズによって定義されます。システムメモリはマッピングオプションの一つであり、もう一つは通常、フラッシュメモリ内のメインファームウェアです。この場合、ファームウェアはブートROMが行うすべての処理を実行することになります。ファームウェアの一部は、STのブートROMと同様にブートローダーとして機能する可能性があります。ハードウェアはブート領域に読み取り専用アクセスを強制し、ユーザー定義のブートROMとして利用することができます。
iOSデバイスでは、ブートROMエクスプロイト(limera1n [16] 、 alloc8 [17] 、 checkm8 [8] [16]エクスプロイトなど)がiOSの脱獄に利用されることがある。iOSに影響を与えるエクスプロイトと比べて、デバイスの脱獄を望む人にとって有利な点は、ブートROMは変更できないこと、そしてiOSデバイスにはブートROMにコードを追加するためのヒューズがないため、Appleは既存デバイスの脆弱性を修正できないことである。
NvidiaのTegra SoC ( Nintendo Switchで使用)のブートROMには、ユーザーが望むブートローダーを実行できる脆弱性が含まれていました。 [18] [19]