オンボードメモリなしでカスタムPCI Expressデバイスを読み書きできるWindowsドライバを作成できるように、PCI Expressの仕組みを理解しようとしています。
PCIE構成スペースのベースアドレスレジスタ(BAR)には、PCI Expressが応答する/書き込みを許可するメモリアドレスが保持されていることを理解しています。 (その正しい理解はありますか?)
私の質問は次のとおりです。
お時間をいただきありがとうございます。
宜しくお願いします、
クエリから、PCIeスレーブデバイス用のドライバーを作成することが明らかです。 PCIe転送の背後で起こっていることのスキームを理解するために、インターネット上で多くのものが利用可能です(PCIeバス列挙、メモリへの周辺アドレスマッピングなど)。
はい、PCIeレジスタのメモリへのマッピングに関する理解は正しく、それらを読み書きできます(たとえば、Linux PCIeデバイスドライバーの場合は、「ioremap」を使用してこれを実行できます)。
アドレスバスは、物理アドレスを指定するために使用されます。プロセッサまたはDMA対応デバイスがメモリロケーションを読み書きする必要がある場合、アドレスバス上のメモリロケーションを指定します。それ以上追加するものはありません。 「PCIeバス列挙」トピックは、2番目の質問に答えます。
3番目の質問はあいまいです。スレーブPCIeデバイスを意味します。そうだとすれば、はい、DMAコントローラを使用して、スレーブPCIeデバイスとホスト間でデータを転送できます。設計と実装に本当に依存しているので、私の場合、PCIe-DMAはそれ自体、PCIe経由でホストに接続されたターゲットボード上のスレーブPCIeデバイスです。
また、カスタムボードを使用してデバイスドライバー(Linuxでも)を開発しています。ここにあなたの質問に答える私の試みがあります:
BARは、ホストシステム(CPU)がデバイスと通信するために見るメモリウィンドウを表します。デバイスはそのウィンドウに書き込みをせず、単にTLP(トランザクションレイヤーパケット)要求(MRd *、MWr *)に応答します。
アーキテクチャにバスレイヤートラスレーションメカニズムがない場合、「バス固有」=「物理」アドレスと言います。詳細については、 このスレッド を確認してください。
これまでに使用したすべてのx86コンシューマーPCで、BARアドレスはBIOSまたはOSブートのいずれかによって割り当てられたようです。ドライバーは、割り当てられたアドレスに対応する必要があります。
用語DMAは、PCIeで正しい用語であると信じているバスマスタリングの代わりに悪用されているようです。PCIeでは、すべてのデバイスが( コマンドレジスタビット2 )。MRd、MWr TLPをバス内の他のデバイス(ただし、一般的にはシステムメモリ)に送信し、CPUに割り込みを通知します。
疑問/疑問の明確化はこちらです。
1>物理アドレスとは異なる用語でMemeoryを見るPCIのようなBUS上にある多くのデバイスがあり、それらはバスアドレスと呼ばれます。たとえば、バスに座っているデバイスからシステムのメインメモリにDMA)を初期化する場合、宛先アドレスはMemmoryの同じ物理アドレスの対応するバスアドレスである必要があります
2>列挙の時点でBARSが読み込まれます。通常のPCでは、ブート時にPCI対応のFrimwareがスロットに存在するPCIデバイスを列挙し、アドレスとサイズをBARSに割り当てます。
3>はい、これらのバーでDMA開始またはCPU開始操作の両方を使用できます。
- 高く飛ぶ