これが尋ねられてからしばらく経ちましたが、孤児の質問は嫌いです:)
まず、最新のx86プラットフォームを単純化し、0x00000000から0xFFFFFFFFまでの32ビットのアドレス空間があると仮定します。すべての特別/予約領域、TOLUD(使用可能な下のDRAM、Intelの用語)ホールなどはすべて無視します。このシステムメモリマップと呼びます。
第二に、PCI Express は PCIを拡張します。ソフトウェアの観点からは、非常によく似ています。
まず、3番目の構成スペースにジャンプします。構成スペースを指すアドレスは、システムメモリマップから割り当てられます。PCIデバイスには256バイトの構成スペースがありました。これはPCIエクスプレス用に4KBに拡張されています。この4KBのスペースはシステムメモリマップからメモリアドレスを消費しますが、実際の値/ビット/内容は一般に周辺機器のレジスタに実装されます。たとえば、ベンダーIDまたはデバイスIDを読み取ると、使用されているメモリアドレスがシステムメモリマップからのものであっても、ターゲットの周辺機器はデータを返します。
これらは「RAMに割り当てられている」と述べましたが、実際には、実際のビット/ステートフル要素は周辺機器にあります。ただし、それらはシステムメモリマップにマップされます。次に、すべてのPCIeデバイスに共通のレジスタのセットであるかどうか(はい、いいえ)を尋ねました。PCI構成スペースが機能する方法では、各セクションの最後に、読み取る「もの」があるかどうかを示すポインターがあります。すべてのPCIeデバイスが実装しなければならない最低限のものがあり、その後、より高度なデバイスがさらに実装できます。機能的な操作にどれほど役立つかは、必須であり、頻繁に使用されています。:)
さて、BAR(ベースアドレスレジスタ)についての質問は、メモリスペースとI / Oスペースに分けるのに適したスペースです。多少x86中心であるため、この仕様では、タイプに加えてBARサイズを指定できます。これにより、デバイスは通常のメモリマップBARまたはIOスペースBARを要求できます。IOスペースBARは、x86マシンが持つ4KのI / Oスペースの一部を消費します。PowerPCマシンでは、I / OスペースBARには価値がないことに気付くでしょう。
BARは、基本的に、ホストに必要なメモリの量とタイプ(前述)を伝えるデバイスの方法です。たとえば、1 MBのメモリマップ領域を要求すると、BIOSはアドレス0x10000000から0x10100000を割り当てます。これは物理RAMを消費するのではなく、アドレススペースだけです(32ビットシステムがGBのRAMを搭載したハイエンドGPUのような拡張カードで問題に遭遇する理由がわかりましたか?)。これで、0x10000004と言うメモリ書き込み/読み取りがPCI Expressデバイスに送信されます。これは、LEDに接続するバイト幅のレジスタです。したがって、物理メモリアドレス0x10000004に0xFFを書き込むと、8つのLEDが点灯します。これは、メモリマップドI / Oの基本的な前提です。
I / Oスペースも同様に動作しますが、独立したメモリスペースであるx86 I / Oスペースで動作します。アドレス0x3F8(COM1)は、I / O空間とメモリ空間の両方に存在し、2つの異なるものです。
最後の質問であるメッセージは、新しいタイプの割り込みメカニズム、メッセージシグナル割り込み、または略してMSIを指します。レガシーPCIデバイスには、INTA、INTB、INTC、INTDの4つの割り込みピンがありました。通常、これらはスロット間でスウィズルされ、INTAはスロット0のINTA、スロット1のINTB、スロット2のINTC、スロット3のINTD、スロット4のINTAの順に戻ります。これは、ほとんどのPCIデバイスはINTAのみを実装し、3つのデバイスを使用してスウィズルすると、それぞれが割り込みコントローラーへの独自の割り込み信号になります。MSIは、PCI Expressプロトコルレイヤーを使用して割り込みを通知する方法であり、PCIeルートコンプレックス(ホスト)がCPUの割り込みを処理します。
この答えはあなたを助けるには遅すぎるかもしれませんが、おそらくそれは将来のGoogler / Bingerを助けるでしょう。
最後に、先に進む前に、Intelからこの本を読んで、PCIeの詳細な入門書を読むことをお勧めします。別のリファレンスは、LWNのオンライン電子ブックであるLinux Device Driversです。