Skip to content
uchan-nos edited this page May 5, 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

Clone this wiki locally