Skip to content
uchan-nos edited this page May 11, 2016 · 15 revisions

AHCI (Advanced Host Controller Interface) についてのメモ書き

2016/05/05 by uchan

メモのスコープ

最終的に SATA ディスクを制御することを目標に、しかし知的好奇心が満たされるよう、最短経路よりは少し豊富な情報を提供する。 AHCI デバイスのメモリ空間、FIS の種類と構造、ATA コマンドの送受信方法、ATA コマンドの種類などを扱う。

SATA ディスクを読み書きするまでの道のり

  1. AHCI デバイスを発見する
    • ベースクラス 01h、サブクラス 06h の PCI デバイスを探す
  2. 各メモリマップを設定する
    • Command List や Received FIS 等のメモリ領域を設定する
  3. SATA デバイスを探す
    • 何番ポートにどんなディスクが接続されているか、されていないか
  4. READ DMA コマンドを準備する
    • Command List 上に READ DMA コマンドを構築する
  5. コマンドを送信する
    • PxCI レジスタのコマンドスロット番号に対応するビットに 1 を書く
    • 事前に PxCMD.ST を 1 にセットしておく必要がある
  6. 割り込みを待ってデータを受け取る
    • 割り込みを有効にしておけば、すべてのコマンドのやり取りが終わった後で割り込まれる
    • 割り込み後、PRDT に設定したメモリ領域にデータが格納されている

ABAR: AHCI デバイスのメモリ空間

AHCI の機能は PCI デバイスとして実装される。そのため、もちろん PCI コンフィグレーションレジスタを持つ。6 本ある 32 ビット BAR のうち、最後の 1 本(オフセット 24h)が AHCI の制御に使われる BAR である。これを ABAR (AHCI Base Address Register) と呼ぶ。

他の BAR はオプショナルであり AHCI には関係ない。AHCI に対応しない古いソフトウェアをサポートするため、IDE コントローラを実装するのに使われたりする。

すべての BAR は BIOS や UEFI が適切な値を設定しているはずなので、自作 OS 側では何も設定する必要はない。cf) PCI Memo

ABAR で指される領域に AHCI コントローラ(HBA: Host Bus Adapter)を制御するレジスタ群がある。さらにその中にもアドレスを格納するレジスタがあり、いろいろなメモリ領域が数珠つなぎになっている。その様子を図示する。

AHCI Memory MapFull Size

HBA Memory Registers

AHCI コントローラを制御するためのレジスタ群である。PCI コンフィギュレーション空間にある ABAR によってメモリにマップしてアクセスする。

HBA Memory Registers は大きく Generic Host Control レジスタと Port Control レジスタに分かれる。前者は名前の通り AHCI コントローラ全体に影響するレジスタだ。後者は同じ構造のレジスタが SATA ポートごとに一組用意されている。規格上は最大 32 ポートまで扱えるが、実際に使える数は AHCI コントローラに依存する。

Clone this wiki locally