私は、PCIカードのベースアドレスレジスタ(BAR)がどのように機能するかを理解しようとしています。
私は正しいですか?
この質問は、stackoverflowに移動する必要があります。多分誰かがそれをするでしょう。
私は正しいですか?
本質的に、はい。
各BARは通信エリアのアドレスを保持します。このアドレスは、より大きなデバイス構成の一部としてオペレーティングシステムによって設定および読み取られます。
各BARに対して(独立して)、デバイスはプロセッサが書き込む可能性のあるビットの一部のみを保存し、その他は無視します。 (32ビットのBAR構成で)28の可能なビットのうち、デバイスはいくつかの上位ビットのみを格納し、残りの下位ビットは無視します。
このメカニズムにより、仕様では、2の累乗である通信領域のサイズと、同じ2の累乗のアドレス空間内のアライメントのみが許可されます。
オペレーティングシステムがBARに-1(つまり、すべて1)を書き込み、それを読み取る場合、デバイス内のこのBARが格納/表現する(上位)ビットに対してのみ1を返し、0を返します。このBARが格納/表示しない下位ビット。
返される1(ゼロ)の数は、オペレーティングシステムに何を知る必要があるかを通知します。これは、BARで何ビットが表現されている(または表現されていない)かを示します。それから、デバイスが必要とするアドレス空間のサイズと、デバイスが期待する配置を簡単に決定できます。詳細は here を参照してください。
適切なアドレス空間を割り当てた後、その実際の値をBARに書き込みます(以前に書き込まれた-1を置き換えます)。これで、BARが適切に構成されました。
注意:オペレーティングシステムはアドレス空間を割り当てますが、実際のメモリ:通信領域のメモリがデバイスによって提供されているかのように、プロセッサはこれからアドレスを指定できるロケーション。
オペレーティングシステムは、通信領域のサイズと配置をハードウェアに正式に要求するのではなく、このトリックを使用して、すべて1を書き込んで効果を観察します。
ハードウェアは、オペレーティングシステムが-1について「冗談」であることを認識している必要はありません(または、それ以外の場合は、実際に問い合わせを行っていることを認識しています)。常にBARへの書き込み(つまり、上位Nビットの格納)で行うことを単純に実行し、(BARの)読み取り要求を通常どおりに実行します(格納されていない下位ビットのゼロと連結された上位Nビットを返すことにより) )。