1. ホーム
  2. c

[解決済み] vmallocとkmallocの違いは何ですか?

2022-02-14 06:59:02

質問内容

ググってみたところ、ほとんどの人が kmalloc 連続した物理的なメモリブロックの取得が保証されるからです。しかし kmalloc は、連続した 物理的 ブロックが見つかりません。
メモリブロックを連続させることのメリットは何ですか?具体的には、なぜ連続した 物理的 のメモリブロックを作成します。 システムコール ? 何か理由があるのでしょうか? vmalloc ?
最後に、システムコールの処理中にメモリを確保する場合、以下のように指定する必要があります。 GFP_ATOMIC ? システムコールはアトミックなコンテキストで実行されるのですか?

GFP_ATOMIC
このアロケーションは優先度が高く はスリープしません。このフラグは 割り込みハンドラ、ボトム を使用する必要があります。 はスリープできません。

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

どのように解決するのですか?

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

vmalloc は kmalloc よりも遅いことが多いのですが、これはバッファ領域を実質的に連続した範囲に再マップする必要があるためです。

kmallocは提供できるバッファのサイズに制限があります。128 KBytes *) . 本当に大きなバッファが必要な場合は、vmallocを使うか、起動時に高いメモリを確保するなどの仕組みが必要です。

*) これは以前のカーネルではそうでした。最近のカーネル(私は 2.6.33.2 でテストしました)では、単一の kmalloc の最大サイズは最大 4 MB です! (私はかなり これに関する詳細な記事 .) - カイワン

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