問題タブ [kmalloc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - vmalloc と kmalloc の違いは何ですか?
kmalloc
グーグルで検索したところ、メモリの連続した物理ブロックを取得することが保証されているため、ほとんどの人が の使用を主張していることがわかりました。ただし、kmalloc
必要な連続した物理ブロックが見つからない場合は失敗する可能性もあるようです。
メモリの連続したブロックを持つことの利点は何ですか? 具体的には、システム コールでメモリの連続した物理ブロックが必要になるのはなぜですか? 使えなかった理由はありますか?
最後に、システム コールの処理中にメモリを割り当てる場合、指定する必要がありますか? システムコールはアトミックコンテキストで実行されますか?vmalloc
GFP_ATOMIC
GFP_ATOMIC
割り当ては優先度が高く、スリープしません。これは、割り込みハンドラー、下半分、およびスリープできないその他の状況で使用するフラグです。
GFP_KERNEL
これは通常の割り当てであり、ブロックされる可能性があります。これは、スリープしても安全な場合にプロセス コンテキスト コードで使用するフラグです。
c - どのkmallocフラグを使用する必要があるか
の各フラグをいつ使用するかを説明するドキュメントを見つけるために、どこでも検索してきましたkmalloc
。いくつかのフラグをいつ使用するかをかなり説明しているこのリファレンスを見つけましたが、ヘッダーファイルで他のフラグや他のフラグをGFP_HIGHUSER_PAGECACHE
見つけることができません...誰かがこれらの他のフラグをいつ使用するか教えてもらえますか?GFP_HIGHUSER_MOVABLE
gfp.h
c - kmalloc でのカーネル クラッシュ
kmalloc
実際にキューイング分野でカーネルコードを使用してメモリを割り当てようとしています。キューイングの規律であり、構造体であるメモリを割り当てたいので、次のようにメモリを割り当てq->agg_queue_hdr
ます。q
agg_queue_hdr
カーネルがクラッシュします。kmalloc
検索で見た例に基づいて、次のように変更しました。
カーネルがクラッシュしません。ポインタにメモリを割り当てる方法を知りたいq->agg_queue_hdr
ですか?
linux-kernel - kmallocフラグのGFPの意味は何ですか?
GFP
のフラグの意味は何kmalloc
ですか? たとえばGFP_KERNEL
、GFP_ATOMIC
?
memory - 大きな (>2M) ページを使用するように kmalloc に指示するにはどうすればよいですか?
DMA に大きなバッファを割り当てるデバイス ドライバを作成しています。私のシステムは 4k ページを使用しています (または私はそう信じています)。より大きなページ、つまり少なくとも 2M ページを使用したいと考えています。
どうやって:
- システムで大きなページを有効にしますか (またはそれらが有効になっているかどうかを確認します)?
kmalloc
現在は大きなページを使用する必要があることを指定しますか?
linux - kmalloc()によって割り当てられたメモリは自動的に解放されますか?
とりわけ、メモリのブロックをで割り当てるデバイスドライバを作成していますkmalloc
。このメモリは、ユーザープログラムがファイルを閉じるときに解放されます。私の実験の1つでは、ファイルを閉じずにユーザープログラムがクラッシュしました。
何かがこの記憶を解放したでしょうか?
別の実験ではkfree()
、close()
関数から関数に移動しましたmodule_exit()
。ユーザープログラムを2回続けて実行したとき、kmalloc
最初に解放せずに、以前と同じポインターを使用して再度呼び出しました。したがって、私はそのメモリへのポインタを失い、それを解放することができません。
このメモリは、再起動するまでシステムに失われますか、それともドライバをアンロードすると解放されますか?
linux - LinuxでGFP_DMAでkmallocを使用すると、なぜ高いアドレスを取得するのですか?
LinuxでDMAデバイス用のデバイスドライバーを作成しています。Linuxデバイスドライバーの第15章では、次のように述べています。
この種の制限があるデバイスの場合、メモリは、GFP_DMAフラグをkmallocまたはget_free_pages呼び出しに追加することにより、DMAゾーンから割り当てる必要があります。このフラグが存在する場合、24ビットでアドレス指定できるメモリのみが割り当てられます。または、汎用DMAレイヤー(後で説明します)を使用して、デバイスの制限を回避するバッファーを割り当てることができます。
私はkmalloc
このように呼んでいます:
次のように結果を出力します。
そして、これは私が見るものです:
0xffff880000180000
GFP_DMAを使用した場合、24ビットに収まらないへのポインタを取得するにはどうすればよいですか?
これは私のメモリブロックの物理アドレスではない可能性がありますか?そうでない場合(つまり、私は完全に誤解していることを意味しkmalloc
ます)、どうすればその物理アドレスを取得できますか?
私はOpenSuse12で働いています。
linux - kmallocは、物理アドレスのサイズよりも大きい物理アドレスをどのように返すことができますか?
kmalloc
Linuxのデバイスドライバーでメモリのブロックを割り当てています。私が取得するアドレスはです0xffff880000180000
。46ビットの物理アドレス空間を持つIvyBridgeプロセッサを使用しています。つまり、CPUには46個を超えるアドレス指定ピンがないため、上記のアドレスにはアクセスできません0x00003fffffffffff
。私が取得しているアドレスは、ビット47が設定されているため、明らかにそれよりも大きくなっています。
が物理ポインター(つまり、仮想アドレス、線形アドレス、物理アドレスが同じポインター)を返すと仮定するとkmalloc
、CPUからアクセスできない場合、どのようにしてそのようなアドレスを取得できますか?
この質問は、「LinuxでGFP_DMAでkmallocを使用すると、なぜ高いアドレスを取得するのですか?」に関連しています。ただし、同じではありません。この質問はkmalloc
、一般的な物理アドレスの返送に関するものですが、リンクされた質問は、返送されGFP_DMA
たアドレスの使用とその関係に関するものです。
driver - この例で memset の使用を理解する
Linux デバイス ドライバーの本 ( http://lwn.net/Kernel/LDD3/ )の例を調べていますが、このコンテキストでの関数memsetの使用と有用性を理解していません。説明して。kmallocを使用してデバイス構造にメモリを割り当て、memset を使用してメモリ アドレスの前に 0 を配置することを理解していますか? それにもかかわらず、ここに例があります:
linux - kmalloc が返すアドレスの物理アドレス
kmalloc が返すアドレスについて少し混乱しています。仮想メモリマップによると、取得しているアドレスはffff880000000000
-ffffc7ffffffffff
の範囲にあるため、「すべての物理メモリの直接マッピング」です。このマッピングはどのように機能しますか? kmalloc が単に物理アドレスを返すわけではないことは確かです。