-
Notifications
You must be signed in to change notification settings - Fork 5
AHCI Memo
AHCI (Advanced Host Controller Interface) についてのメモ書き
2016/05/05 by uchan
最終的に SATA ディスクを制御することを目標に、しかし知的好奇心が満たされるよう、最短経路よりは少し豊富な情報を提供する。 AHCI デバイスのメモリ空間、FIS の種類と構造、ATA コマンドの送受信方法、ATA コマンドの種類などを扱う。
- AHCI デバイスを発見する
- ベースクラス 01h、サブクラス 06h の PCI デバイスを探す
- 各メモリマップを設定する
- Command List や Received FIS 等のメモリ領域を設定する
- SATA デバイスを探す
- 何番ポートにどんなディスクが接続されているか、されていないか
- READ DMA コマンドを準備する
- Command List 上に READ DMA コマンドを構築する
- コマンドを送信する
- PxCI レジスタのコマンドスロット番号に対応するビットに 1 を書く
- 事前に PxCMD.ST を 1 にセットしておく必要がある
- 割り込みを待ってデータを受け取る
- 割り込みを有効にしておけば、すべてのコマンドのやり取りが終わった後で割り込まれる
- 割り込み後、PRDT に設定したメモリ領域にデータが格納されている
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 コントローラを制御するためのレジスタ群である。PCI コンフィギュレーション空間にある ABAR によってメモリにマップしてアクセスする。
HBA Memory Registers は大きく Generic Host Control レジスタと Port Control レジスタに分かれる。