3

ユーザー空間からドライバーに大きなデータ ブロック (~6MB) を転送する必要があります。ドライバーでは、pci_alloc_consistent() を使用して、ブロックごとに 2 つの 3MB チャンクを割り当てます。次に、vm_insert_page() を使用して、各ブロック (つまり 2 つのチャンク) を単一の vma に mmap() します。これにより、ユーザー空間は、mmap した後に各ブロックを読み書きできます。動作しているように見えますが、パフォーマンスは受け入れられません。

また、ドライバの pci_alloc_consistent() によって割り当てられたメモリへの書き込み/メモリからの読み取りの別の方法も実装しました。ユーザー空間から write() を使用してから、ドライバーで copy_from_user() を使用して、ブロック内の各チャンクのコンテンツを上記のメモリに移動します。私は読み取りのために反対を行います。

最初のアプローチは少なくとも 2 ~ 3 倍遅く、CPU の使用量が最大 40% 多いことがわかりました。2 番目のケースで追加のバッファー コピーを導入すると、処理が遅くなると予想しました。しかし、そうではありませんでした。

x86 64 ビット プラットフォーム、カーネル 2.6.* および 3.* でテストを実行しました。

上記の結果は意味がありますか?はいの場合、誰かが何が起こっているかについての背景を説明してもらえますか?

ありがとう。

4

1 に答える 1