PCIeのアドレススペース


19

PCI Expressには4つのアドレススペースがあります。

  • メモリマップ
  • I / Oマッピング
  • 構成スペース
  • メッセージ

誰もが各アドレス空間の重要性を説明できますか、それは簡単に目的ですか?

私の理解では、これらのすべてのスペースはRAM(つまり、プロセッサのメモリ)に割り当てられます。コンフィギュレーションスペースは、レジスタの共通セット(すべてのPCIeデバイスに存在)に割り当てられたスペースです。このスペースはすべてのPCIeデバイスに共通ですか?また、PCIeの機能動作にどのように役立ちますか?

このスペースにはBAR(ベースアドレスレジスタ)が含まれます。このレジスタは、PCIeエンドポイントで使用可能なアドレスを指定するために使用されますか?

私はPCIeを初めて使い、それを学ぼうとしています。基本仕様を参照していますが、PCIおよびPCIeの予備知識がある読者向けに書かれていると思います。

また、基本仕様の理解をスピードアップするのに役立つ無料のオンラインリファレンスを参照してください。ルートコンプレックスが接続されたPCIeデバイスには、常にメモリ領域が割り当てられることを理解しています。

回答:


31

これが尋ねられてからしばらく経ちましたが、孤児の質問は嫌いです:)

まず、最新の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です。


投稿はとても役に立ちました。私はPCIeを初めて使用します。列挙プロセスを実行するには(構成スペースの割り当てとマッピング)、ドライバーのサポートが必要ですか、Osによって開始できます。
カムレンドラ

ありがとう、助かりました!通常、x86プラットフォームでは、BIOSソフトウェアはPCIデバイスから解析した構成スペース情報に基づいて、ある程度のメモリ割り当てを行います。最近のOSは一般にこのメモリマップをそのまま受け入れますが、それらも適切なドライバーをロードするためにデバイスを列挙して列挙します。Linuxで、BIOSが割り当てたものを潜在的に変更できる可能性のある興味深い低レベルのものをいくつか覚えています。
クルナルデサイ

プリフェッチ可能としてマークされたメモリのみが、トランザクションごとに複数のDWORDを転送できることに注意してください。他のすべてのスペースは、トランザクションごとに1つのDWORD のみを転送できます。バーストのサイズはMAX_PAYLOAD_SIZEに制限されます(列挙中に検出されます)。
ピータースミス

こんにちは。私はPCIを初めて使用しますが、回答について少し説明をお願いします。256b / 4kバイトの構成スペースがシステムメモリにマップされると述べました。私の個人指導から、構成スペースへのアクセスは、システムメモリに静的にマッピングされるPCIコントローラーを介して処理されると考えました。このコントローラーは、構成スペースへの小さなインターフェイスとして機能するいくつかのレジスター(デバイス/機能の識別、アドレススペースへのオフセット、結果アドレス用)を提供します。したがって、実際には、PCIコントローラー用に静的に予約されるのは約5〜10バイトだけです。これは正しいですか ???
セレッソ

したがって、ホスト(CPU)がアドレス0x10000004のレジスタに値0xFFを書き込むと、PCIルートコンプレックスはこのデータをフェッチし(おそらく0x10000000から0x10100000までの任意のアドレスのデータをポーリングしていた)、アドレスに書き込みますエンドポイント(PCIeデバイス)で0x04?この理解は正しいですか?
AlphaGoku
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.