vmalloc と kmalloc の違いは何ですか? 質問する

vmalloc と kmalloc の違いは何ですか? 質問する

グーグルで調べたところ、ほとんどの人が の使用を推奨していることがわかりました。連続した物理メモリブロックが確実に得られるからです。しかし、は連続したメモリブロックがない場合は失敗することkmallocもあるようです。kmalloc物理的な必要なブロックが見つからない。
連続したメモリブロックを持つことの利点は何ですか?具体的には、なぜ連続したメモリブロックが必要なのでしょうか?物理的なメモリのブロックシステムコール? を使用できない理由があるのでしょうかvmalloc?
最後に、システム コールの処理中にメモリを割り当てる場合は、 を指定する必要がありますかGFP_ATOMIC? システム コールはアトミック コンテキストで実行されますか?

GFP_ATOMIC
割り当ては優先度が高く、スリープしません。これは、割り込みハンドラ、ボトムハーフ、およびスリープできないその他の状況で使用するフラグです。

GFP_KERNELこれは通常の割り当てであり、ブロックされる可能性があります。これは、スリープしても安全な場合にプロセス コンテキスト コードで使用するフラグです。

ベストアンサー1

物理的に連続したメモリの使用について心配する必要があるのは、バッファが物理的にアドレス指定されたバス(PCI など)上の DMA デバイスによってアクセスされる場合のみです。問題は、多くのシステム コールでは、バッファが最終的に DMA デバイスに渡されるかどうかを知る方法がないことです。バッファを別のカーネル サブシステムに渡したら、それがどこに行くのかは実際にはわかりません。カーネルが DMA にバッファを使用しない場合でも、今日、将来の開発ではそうなるかもしれません。

vmalloc は、バッファ スペースを事実上連続した範囲に再マップする必要がある場合があるため、kmalloc よりも遅くなることがよくあります。kmalloc は再マップしませんが、GFP_ATOMIC で呼び出されない場合、kmalloc はブロックできます。

kmalloc は、提供できるバッファのサイズが 128 KB に制限されています*)。非常に大きなバッファが必要な場合は、vmalloc を使用するか、起動時に高メモリを予約するなどの他のメカニズムを使用する必要があります。

*) これは以前のカーネルでは当てはまりました。最近のカーネル(2.6.33.2でテストしました)では、1回のkmallocの最大サイズは4MBです!(私はかなりこれに関する詳細な投稿.) — カイワン

システム コールの場合、GFP_ATOMIC を kmalloc() に渡す必要はなく、GFP_KERNEL を使用できます。割り込みハンドラーではありません。アプリケーション コードはトラップによってカーネル コンテキストに入りますが、これは割り込みではありません。

おすすめ記事