ハードウェア デバイスがいっぱいになるまで最大 1MB のバッファーを必要とするアプリがあるため、kmalloc() を使用してバッファーを割り当てるカーネル モジュールを作成しました。dma_alloc_coherent() は使用しませんでした。バッファーを操作する必要があるため、バッファーをキャッシュする必要があったためです (必要に応じてキャッシュをフラッシュします)。実行される操作の 1 つは、カーネル モジュールが 1 つのバッファーを別のバッファーにコピーすることです。これらのコピーのタイミングでは、バッファをコピーするのに約 2 ミリ秒かかることがわかります。この時間には、キャッシュのフラッシュは含まれていません。
これは遅いように見えたので、malloc() を使用して 1MB のバッファーを作成し、それらをコピーする標準のユーザー空間テスト アプリを作成しました。ユーザー空間のコピーには約 0.5 ミリ秒かかりました。これは、使用しているプロセッサ/メモリ構成でこの量のメモリを移動するのに適切な時間です。
試してみたこと: カーネル空間とユーザー空間で異なる memcpy() でないことを確認するために、独自の NEON 最適化コピーを作成しましたが、違いはありませんでした。バッファ サイズを 100KB から 10MB に変更しましたが、違いはありませんでした。すべての回で 10 部以上のコピーがありましたが、常に非常に一貫性がありました。時間ルーチンは、ユーザー空間で gettimeofday() を使用しました。
私たちが考えることができる唯一のことは、データキャッシュが kmalloc() されたメモリと malloc() されたメモリで異なるように設定されているということです???
iMX6 ARM、Linaro kerne に取り組んでいます。