[解決済み] vmallocとkmallocの違いは何ですか?
質問内容
ググってみたところ、ほとんどの人が
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 を使用できます。アプリケーション コードは、トラップによってカーネル コンテキストに入るので、割り込みハンドラではありません。
関連
-
[解決済み】Cコンパイルエラー。"変数サイズのオブジェクトが初期化されていない可能性がある"
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] C++でextern "C "を使用した場合の効果は?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] ++iとi++の違いは何ですか?
-
[解決済み] mallocとcallocの違い?
-
[解決済み] char s[]とchar *sの違いは何ですか?
-
[解決済み] floatとdoubleの違いは何ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】定義と宣言の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Valgrind - strcpyのサイズ1の無効な書き込み
-
[解決済み】C言語におけるファイルスコープでの可変長配列の変更
-
[解決済み】GCC Cコードで静的宣言が非静的宣言に続くことを解決するには?
-
[解決済み】 「配列のイニシャライザーはイニシャライザーリストまたは文字列リテラルでなければなりません」と表示されるのですが?
-
[解決済み】C言語で入力が整数型かどうかチェックする
-
[解決済み】なぜか。"エラー: 配列型を持つ式への代入"
-
[解決済み】宣言指定子で2つ以上のデータ型がある場合のエラー【非公開
-
[解決済み] '{'トークンの前に期待される式
-
[解決済み】makefile:4。*** missing separator. 停止する
-
[解決済み】whileループの時間複雑性(Big O)はどうやったらわかるの?