pikesaku’s blog

個人的な勉強メモです。記載内容について一切の責任は持ちません。

BIOSとUEFI

しっかりメモに残そう!!!

BIOSとは?

Basic Input/Output Systemの略名

BIOSはパーソナルコンピュータ(PC)に組み込まれており、電源投入と同時に実行される。ハードウェアを初期化し補助記憶装置からブートローダーを呼び出す。またキーボードやディスプレイなどの入出力装置をプログラムから利用するためのサービスを提供する。プログラムはハードウェアに直接アクセスするのではなく、これらサービスを利用する事でハードウェア差を気にしなくて良くなる。ただし近代的なオペレーティングシステム (OS) はこの抽象化層を使用せず、OSのデバイスドライバで直接制御する場合が多い。

ハードウェアへのアクセスは主に入出力レジスタの操作で行うが、その動作や配置はハードウェア種によって異なる。また、読み書きのタイミングや順序にも手順がある。このためアクセス手順はアプリケーションで記述するより、ハードウェア種毎にサブルーチンを用意する方が有用でありこれがBIOSである。ISAやPCIなどではボードのROMにBIOSプログラムがあり、これはメモリ上に展開されてアプリケーションから利用される。マザーボード側のBIOSをSystem BIOS拡張カードBIOSを拡張BIOSと区別して呼ぶことがある。

また同種のハードウェアでも操作方法が異なる場合もある。これに対処するためBIOSの呼び出しインタフェースは共通化されており、アプリケーションはBIOSサービスを呼ぶだけで複数のデバイスに対応できる。このような共通インタフェースはアプリケーションバイナリインタフェース(ABI)と呼ばれる。

例として、PC/AT互換機VGA BIOS(Video BIOS、ビデオバイオスとも)は、共通化されたABIを呼び出す事でハードウェアの違いを意識せず文字、画像の表示を可能にした。これはビデオカードのROMに実装された拡張BIOSである。 同様にハードディスク、フロッピーディスク、キーボードなどさまざまな入出力処理を行うBIOSが存在するが、これら基本的なものはSystem BIOSでありマザーボードのROMに実装される。

しかし、上記が有効なのはOSがシングルタスク型の場合であり、マルチタスクOSではデバイスドライバが処理を行う。特にリエントラントが考慮されていないBIOS[4]もあり、各アプリケーションが非同期にこれを呼び出すとOSはハードウェアリソース管理が困難になる。このためハードウェア管理はデバイスドライバが一元的に行い、アプリケーションはOSのシステムコールを利用する。

UEFIとは?

Unified Extensible Firmware Interfaceの略名

オペレーティングシステム(OS)とプラットフォームファームウェアとの間のソフトウェアインタフェースを定義する仕様である。
f:id:pikesaku:20210926094026p:plain
UEFIを採用したSystem BIOSは「UEFI BIOS」と呼ばれ、単に「UEFI」と略されることが多いが、ユーザーがアクセスし設定などを行うGUIUEFIであっても「BIOS」と呼ばれる事が多い。UEFI BIOSIBM PC互換機に採用された古いSystem BIOSのよりセキュアな置き換えを意図している[1]。

EFI仕様によって定義されたインタフェースは、プラットフォーム情報などのデータテーブルを持っている。この情報やEFIの機能はブートローダーやOSが利用できる。UEFIファームウェアには以下のような技術的利点がある[12]。

2TiBを超える大きなディスクからブートできる[13]
より高速なブートが可能である
CPUに依存しないアーキテクチャ
CPUに依存しないドライバ
ネットワークも使用可能な柔軟なプレOS環境が利用できる
モジュール化設計が採用されている

ディスクのサポート
マスターブートレコードMBR)などの標準的なPCのディスクパーティションの処理に加えて、EFIではGUIDパーティションテーブル(GPT)をサポートしている。これによりPCでのディスクパーティションの容量の限界と領域の数の制限は拡張され、同じ時期に開発された2TB以上のシリアルATA接続の内蔵ハードディスクからの起動がサポートされた[14]。GPTでのディスクとパーティションの最大サイズは9.4ZB(273バイト)である[14][15]。EFI規格ではファイルシステムには言及していないが、UEFI規格ではFAT12FAT16FAT32のサポートを必須としている。

プロセッサのサポート
バージョン2.3では、Itanium、x86x86_64、ARMアーキテクチャをサポートしている(バインディングが存在する)。

System BIOSは16ビットのIntel 8088を採用したIBM PCの設計に基づいているため、16ビット・プロセッサモードと1MBのアドレス空間という制限があった[6][16]。一方、UEFIのプロセッサモードは32ビット(x86-32、ARM)または64ビット(x86-64、Itanium)である[6][17]。64ビットのUEFIではロングモードも可能であり、OSブート前の環境で64ビットアドレッシングの全メモリに直接アクセス可能である[18]。

UEFIでは、ファームウェアとOSのアドレス空間が一致していなければならない。たとえば、64ビットのUEFIからは64ビットのOSしかブートできない。

ブートサービス
EFIはブートサービスを定義していて、これにはさまざまなデバイス上でテキストおよびグラフィカルなコンソールが利用できる機能や、バスやブロックデバイスファイルシステムの機能が含まれる。ブートサービスはExitBootServices()を呼び出すまでのファームウェアがプラットフォームを制御している状態でのみ利用可能である。また、OS動作中も利用できるランタイムサービスとしては、UEFI Graphics Output Protocol、UEFIメモリマップ、ACPI、SMBIOS、SMM、日付や時間サービス、NVRAMサービスなどがある。

ブートマネージャー
EFIブートマネージャーはまたOSを選択してロードするのにも使うことができる。これにより専用のブートローダ機構は必要がなくなる(OSのブートローダEFIアプリケーションになる)。この場合、ブートセクタを使用せずに済むが、最初にロードすべき標準で定められた名前のファイルを、特殊なパーティションテーブルから参照できるようにしておく必要がある(ファイル名の例:\EFI\BOOT\boot[architecture name].efi)。

OSのブートローダーはUEFIアプリケーションの一種となるので、ファームウェアからアクセス可能なファイルシステム上にファイルとして格納しておく。NVRAMに格納されたブート変数で、そのローダーのパスを示す。ブートローダーはファームウェアから自動検出することも可能で、たとえばリムーバブル・デバイスからのブートも可能となっている。

また、特定のハードウェアやオペレーティングシステムに依存しないように、UEFIアプリケーションのバイナリコードの記述には、マイクロソフトが開発した、ハードウェアやOSに依存しないバイナリフォーマットであるPortable Executable(PE)フォーマットを用いることが定められている。

デバイスドライバ
EFIの仕様では、標準的なアーキテクチャ依存のデバイスドライバに加えて、プロセッサに依存しないデバイスドライバ実行環境を提供しており、EFI Byte CodeまたはEBCと呼ばれている。システムのファームウェアは、その環境にロードされたもしくはその環境内にあるEBCイメージ用のインタプリタを実行できることを、UEFI仕様によって要求されている。その点、EBCはOpen Firmwareに似ている。これはハードウェアに依存しないファームウェアで、PowerPCベースのAppleMacintoshサン・マイクロシステムズSPARCコンピュータなどの間で採用された。

いくつかのアーキテクチャに特化した(非EBCな)EFIデバイスドライバはOSから利用可能なインタフェースを持つことができる。これにより、OSに特化したドライバをロードしなくても、基本的なグラフィックスやネットワーク機能についてはOSがEFIに頼ることができる。

セキュアブート
UEFIセキュアブートは、起動対象のオペレーティングシステム電子署名を検証して正当なソフトウェアであることが確認できた場合にのみブート処理を継続する[19] 。

WindowsマークのあるマシンではセキュアブートにMicrosoft電子署名が使われており、Windows 8以降はセキュアブート電子署名が付与されている。一方で、Windows 7以前のオペレーティングシステムやほとんどのLinuxディストリビューション電子署名が付与されていないため、セキュアブートが有効なUEFIブートローダーでは起動できない。

拡張機能
EFI拡張機能は、コンピュータに搭載されている不揮発性のストレージデバイスからロードされる。たとえば、マザーボード上のROMに格納されている標準EFIファームウェアに機能を追加するために、OEMがハードディスクにEFIパーティションを作って、そのシステムを販売することができる。

MBRとGPTのブートの違い

機能
MBRがマスターブートコード(ブートローダ:起動できるアクティブパーティションを探してプログラムをそこからロードして実行する機械語コードが入っている)で始まるのに対して、GPTはEFIが持つ拡張機能を使ってその処理を実現している。MBRのエントリがディスクの保護と互換性維持の目的で存在しているのに対して、GPTはパーティションテーブル・ヘッダーとしての役割を担っている。

従来のMBR (LBA 0)
GPTを使用するディスクにもMBRが存在するのは、MBRを前提としたディスクユーティリティを利用した場合の事故の防止のため(誤って何も中身がないと判断されないため)である。MBRにはそのディスク全体がひとつのパーティションになっているという情報が記述されることになっている。GPT自体がBIOSによるMBRパーティションの代替であるため、そのパーティション識別子はシステムIDとして 0xEE が設定され、GPTを使用していることを示すことになっているが、双方のパーティションテーブルに有効な値を定義し、それをハイブリッドMBRと呼称する向きもある。但し、これはGPTの「MBRパーティションに対する置き換え」という目的から標準化、明示的な定義がされていない実装であり、OSによって扱いが異なる。ハイブリッドMBRの構成では多くの場合GUIDパーティションの方が優先されるが、Windowsをベースとするシステムでは、GPTをサポートするものであっても有効なMBRが存在する場合は、そちらを優先して解釈する。また、本来EFIとセットの実装であるが、MBRからGPTを理解するローダへ処理を移すという手段により、比較的最近のLinuxではEFIが実装されていないシステムであっても、GPTからの起動や利用を可能としている[1]。

UEFIでのブートの流れ

主要キーワード

キーワード 説明
UEFIファームウェア そのもの。NVRAMに格納
UEFIブートマネージャ UEFIファームウェアのブート機能だろう
ブートエントリ UEFIブートマネージャが管理するデータ。
UEFIアプリケーション UEFIファームウェアを使ってHW操作したりするアプリケーション
OS のブートローダ GRUBとか。UEFIファームウェアを利用してOS起動するので、UEFIアプリケーションでもある

ブートの流れ

①POSTプロセス
UEFIファームウェアロード
UEFIブートマネージャがブートエントリに従いOSのブートローダをロード
④OSのブートローダが、OSを起動

UEFI環境の画面

UEFI BIOS
f:id:pikesaku:20210926122943p:plain
efibootmgrコマンド結果
f:id:pikesaku:20210926124343p:plain
parted -lコマンド結果
f:id:pikesaku:20210926125013p:plain
blkidコマンド結果
f:id:pikesaku:20210926125323p:plain

まとめ

・必ずBIOS経由でHW操作されてると思ってたが、そうでないみたい。
UEFI自体は仕様。OSとHWの間で、色々便利な機能/を提供するのがUEFI BIOS
UEFI経由で色々なHW操作をするのが、UEFIアプリケーション。
・OSのブートローダUEFIアプリケーションとして実装される。
UEFIブートマネージャはHDDの第一セクタ(MBR)からでなく、ブートエントリに従いOSのブートローダを起動する。
UEFI & GPTの組み合わせ処理でもMBRは互換性維持の為、必要。
UEFI & GPTだけでなく、BIOS & GPTもある。