0

PCIエンドポイントドライバーをテストしています。PCIRootPort側からPCIエンドポイント側に簡単にコピーしたいと思います。PCIエンドポイント側では、PCIアドレスからCPU物理アドレスへのアドレス変換があります。変換でCPU物理アドレスを構成して、特定のDRAM領域にマップすることができます。問題は、RootPort側からの書き込みが実際に機能することを確認するために、その特定のCPU物理アドレスにメモリバッファをどのように割り当てることができるかということです。

任意の推奨事項をいただければ幸いです。どうもありがとう!

4

2 に答える 2

2

最初に物理メモリ領域を予約する必要があります。これを行う最も簡単ですが醜い方法は、カーネルコマンドラインに「mem =」パラメータを渡して、カーネルメモリ管理から関心のある物理メモリ範囲を除外し、ioremap()を使用してその仮想マッピングを取得することです。

たとえば、マシンに256 MbのRAMがある場合、mem = 255Mを使用して最後のMbを使用に予約し、ioermap()を介してマップします。

注:@AdrianCoxからのフィードバックに基づいて修正された元の回答。

于 2013-01-03T09:41:30.870 に答える
1

その場で変換を再マップできる場合は、DMAを使用する他のドライバーと同じように機能する必要があります。これに関する基本的なリファレンスは、LDD3の第15章に加えて、LinuxDMAAPIです。

割り当てているのは、を介したDMAコヒーレントバッファdma_alloc_coherentです。struct deviceほとんどのプラットフォームでは、nullポインターを渡して、汎用DMAアドレスを取得できるはずです。これにより、データにアクセスするためのカーネル仮想アドレスと、変換レイヤーを介してマップするためのCPU物理アドレスであるdmaアドレスの両方が提供されます。

アドレス変換の柔軟性が低い場合は、アドレスアライメントの要件を満たすために、エンドポイントのプラットフォームコードを変更して、このバッファを早期に予約する必要があります。これはもう少し複雑ですが、出発点として役立つ可能性のある最近のカーネルへのbigphysareaパッチの更新があります。

于 2013-01-03T10:08:01.757 に答える