lspci -vv -s 00:00
Linuxを実行しているシングルボードコンピュータで実行すると、次の出力が表示されます。
07:05.0 RAID bus controller: Adaptec AAC-RAID (Rocket) (rev 03)
Subsystem: Adaptec ASR-2230S + ASR-2230SLP PCI-X (Lancer)
Control: I/O- Mem+ BusMaster+ SpecCycle+ MemWINV+ VGASnoop-
ParErr- Stepping- SERR+ FastB2B-
Status: Cap+ 66MHz+ UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR-
Latency: 64 (250ns min, 250ns max), Cache Line Size: 64 bytes
Interrupt: pin A routed to IRQ 74
Region 0: Memory at f7a00000 (64-bit, non-prefetchable) [size=2M]
Region 2: Memory at f79ff000 (64-bit, non-prefetchable)
[Remaining output truncated]
上記はサンプル出力であり、正確に私が得た結果ではありませんが、興味のあるものが含まれています。
lspciコマンドの出力内容をほとんど理解していますが、誰かがこれについて説明してほしいと思います。エリア...ここでローカルラインに割り当てられているメモリの種類は何ですか?どうやってアクセスしますか?この要件では、PCIバスを介して接続された2つの単一ボードコンピュータ間の通信を完了しようとしています。直接話すことができるはずです。バスにはPCIモデレータが1つしかありません。これが私がこれまでに達成したことです...
アウトバウンドPCIトラフィック用のLinuxカーネルモジュールを作成しました。デフォルトでは、ドライバmmapを使用してユーザースペース(ユーザースペースアプリケーションを使用)から最後までマッピングします。 mmapから返された場所に書いて、実際にバスアナライザを使って交通量を確認しました!別のシングルボードコンピュータからPCIデバイスのsysfsリソースを読み取ろうとしましたが、すべてのFFのみが表示され、変更はありません。
このすべてのメモリマッピング(PCI関連)がどのように発生するかについての提案や説明をありがとう。
答え1
lspciオプションに従ってPCIデバイスに関する情報を表示します。詳しくはマニュアルページをご覧ください。
~についてエリア出力ヘッダーでは、この行はこのコンポーネントに使用されるレジスタが割り当てられる場所を詳しく説明します。これは、メモリマッピングと各コンポーネントがメモリを使用する方法に関連しています。
Region 0: Memory at f7a00000 (64-bit, non-prefetchable) [size=2M]
Region 2: Memory at f79ff000 (64-bit, non-prefetchable)
この行は、使用されるレジスタアドレス、サイズ、およびアドレスサイズ(64ビットポインティングレジスタ)を指定します。
このアドレスがどのように使用されるかを詳しく知るには、コンピュータアーキテクチャに関する追加情報を参照してください。