ユーザー空間バッファーからカーネル空間バッファーにコピーすることと、ユーザー空間バッファーをカーネル空間バッファーにマッピングしてから、カーネル空間バッファーを別のカーネル データ構造にコピーすることの違いは何ですか?
私が言いたかったのは:
最初の方法は
copy_from_user()
関数です。2番目の方法は、ユーザー空間バッファーがカーネル空間にマップされ、カーネルが物理アドレスで渡され(たとえば、を使用して
/proc/self/pagemap
)、カーネル空間が渡された物理アドレスを呼び出しphys_to_virt()
て、対応するカーネル仮想アドレスを取得します。次に、カーネルは、そのデータ構造の 1 つからデータskb_buff
を、呼び出しからphys_to_virt()
呼び出しから取得したカーネル仮想アドレスにコピーします。注:渡された物理アドレスに
phys_to_virt()
のオフセットを追加して、0xc0000000
カーネルの仮想アドレスを取得しますよね?
2 番目の方法は、KNI モジュールの DPDK の機能を説明しており、ユーザー空間からカーネル空間へのコピーのオーバーヘッドを排除するとドキュメントに記載されています。方法を教えてください。