BIOSはどのようにして最初のセクターを正確に読み取るのか

BIOSはどのようにして最初のセクターを正確に読み取るのか

ATA コマンド Read Sector がまだ使用されているかどうかを知る必要があります。SATA ストレージ テクノロジーの本で、このコマンドと一般的な PIO 読み込みコマンドはブート プロセスでのみ使用されると読みました。そこでブート プロセスを調べ始めたのですが、少し混乱しています。

BIOS がブート プロセスの一部として最初のセクターまたは MBR を読み取ることは知っています。また、BIOS は INT 13 を使用してそれを実行するとも読みました。

SATA デバイスは HBA を介して通信します。したがって、最初のセクターの読み取りは、SATA と HBA 間の初期化プロセスが完了した後に行う必要があります。

BIOS はどのようにして最初のセクターを読み取るのでしょうか...

HBA は INT 13 を ATA コマンドに変換しますか?そうであれば、
これには AHCI ドライバーの存在が必要ではないでしょうか?
ドライバーはいつロードされますか?

または

BIOS はハードドライブと直接通信しますか?これは不可能だと思います。

答え1

デバイスには、フロッピー、SCSI、ATA、ATAPI、USB マス ストレージ、SATA、NVME などがあります。それらのほとんどにはコントローラがあります (CPU はコントローラとのみ通信でき、コントローラはコントローラに接続されたデバイスと通信します)。コントローラが提供するインターフェイスは、比較的標準化されている場合 (AHCI など) もあれば、そうでない場合もあります (SCSI、ハードウェア RAID コントローラ)。また、コントローラが複数のインターフェイスを提供する場合もあります (SATA コントローラは、AHCI に加えて、従来の (P)ATA エミュレーションと非標準の RAID インターフェイスをサポートし、BIOS 設定で選択するオプションがあります)。

すべてのケースにおいて、BIOS には (最小限の) ドライバー コードが組み込まれています (「比較的標準化された」コントローラー/デバイスおよびマザーボードに組み込まれたコントローラーの場合が多い)。または、コントローラーには (同じ PCI カードなど)「int 0x13」をフック/インターセプトする「デバイス ROM」が組み込まれています。

いずれにせよ、「int 0x13」は「デバイス番号」パラメータを使用してデバイスが何であるかを判断し、そのデバイスのデバイス ドライバー コードに分岐します。

HBA は INT 13 を ATA コマンドに変換しますか?

SATA コントローラがインターフェイスとして AHCI を使用している場合、ドライバは "int 0x13" 要求を HBA の SATA/AHCI コマンドに変換します。SATA コントローラが従来の (P)ATA エミュレーションを使用している場合、ドライバは "int 0x13" 要求を従来の (P)ATA コマンドに変換し、HBA は ATA コマンドを SATA コマンド セットに変換します。

これには AHCI ドライバーの存在が必要ではないでしょうか?

はい。これは最小限のドライバーであり (「ホットプラグ SATA」、ネイティブ コマンド キューイング、セキュア消去、イジェクト、トリムなどをサポートしていません)、単純化のために「コマンドを開始し、並列処理を妨げてコマンドが完了するまでパフォーマンスを低下させながら CPU 時間を浪費し、その後ステータスを返す」というアプローチを使用していることに注意してください。これらのことは、OS が使用したいデバイス ドライバーとはまったく異なることを意味します。

ドライバーはいつロードされますか?

ドライバー コードは常にどこかの ROM に存在します (ある時点でディスクからロードされるわけではありません)。ドライバー コードは、ファームウェアが「デバイス ROM」を検索する前、またはファームウェアが「デバイス ROM」を初期化しているときに初期化されます。

すべてが初期化された後、(BIOS が通常のディスクから起動していると仮定 - たとえば、ネットワークから起動していないと仮定)、BIOS は「int 0x13」を使用して、「デバイス ROM が初期化された後に最終的にデバイスになったもの」から最初のセクターをロードできます。

答え2

SATAアナライザでテストした結果、BIOSやUEFIは次のような遅いATAコマンドを使用しないほど賢いことが判明しました。セクターを読むブートプロセスではATAコマンドを使用しますDMA EXT の読み取り

完全性を期すために、順序は次のようになります。

ドライブが署名を送信した後、HBAはATAコマンドを送信しますデバイスの識別、そして送信するDMA EXT の読み取りLBA = 0 の場合。

OSが使用するかどうかはわかりませんがセクターを読むまたは書き込みセクターいずれにせよ、通常の作業中はそうではありません。FPGA で PIO IN/OUT プロトコルを実装するのは楽しい作業ではないので、そうならないことを願っています。

関連情報