drivers/firewire/ohci.c非同期の一部のページがラップアラウンド受信したパケットへの容易なアクセスを可能にするために二回、リングバッファを受信マッピングします
for (i = 0; i < AR_BUFFERS; i++) {
ctx->pages[i] = alloc_page(GFP_KERNEL | GFP_DMA32);
...
dma_addr = dma_map_page(ohci->card.device, ctx->pages[i],
0, PAGE_SIZE, DMA_FROM_DEVICE);
...
}
for (i = 0; i < AR_BUFFERS; i++)
pages[i] = ctx->pages[i];
for (i = 0; i < AR_WRAPAROUND_PAGES; i++)
pages[AR_BUFFERS + i] = ctx->pages[i];
ctx->buffer = vmap(pages, ARRAY_SIZE(pages), VM_MAP, PAGE_KERNEL);
...
私の知る限り見ることができるように、コヒーレントDMAには類似したAPIはありませんメモリ。あなたのアーキテクチャがこれをどのように処理しているか知っていれば、dma_alloc_coherent()
によって返されたページを再マップすることができます。
あなたが同じ物理アドレスを変更するために複数の仮想アドレスを使用している場合、いくつかのアーキテクチャは、それらのキャッシュに問題があることに注意してください。それをマッピングすることができたとしても、特定のアーチでコヒーレントDMAメモリがキャッシュ可能かどうかをチェックする必要があります。
[kfifo.c](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/libkfifo.c)および[kfifo.h](https: //git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/kfifo.h)は、MMUの助けなしに一定サイズの要素をサポートするバージョンです。それらはカーネルでより一般的です。 –
ありがとう!私はこれが私のアプリケーションではうまくいくと思います。ミラー化されたバッファが必要になるとは思いません。 –