Linuxデバイスドライバvmalloc

作業vmalloc()関数は、kmallocの()に似ていますが、かつての分布の仮想メモリアドレスに連続しているが、あなたは継続的な物理アドレスは必要ありません。これはユーザ空間の割り当て機能が動作している:のmalloc()がページを返します。プロセスの仮想アドレス空間に連続しているが、それは彼らが物理RAMにも連続している保証するものではありません。kmallocの()関数ページ上の物理アドレスが(仮想アドレス自然に連続した)連続していることを保証するために、vmalloc(非連続物理メモリブロックを割り当てることによってそれ、及び、ページ・テーブルを「固定」するために、連続した論理アドレス空間にマッピングされたメモリ領域;)関数は、仮想アドレス空間内のページが連続していることを保証することです。

ほとんどの場合、唯一のハードウェアデバイスは、物理的に連続したメモリ・アドレスである必要があります。多くのアーキテクチャ上で、ハードウェアデバイスは、メモリ管理ユニットの外側には存在し、それは単に仮想アドレスが何であるかを理解していないので、ハードウェアは、任意のメモリデバイスで使用されます唯一の連続ブロックの仮想メモリアドレスを使用することができますし、ソフトウェアのみのメモリ・ブロックを使用し、領域は、連続した物理ブロックで仮想アドレス上だけではなく、連続ブロックしなければなりません。

専用メモリの物理的に連続したブロックである必要があるが、いくつかのケースでは、しかし、カーネルコードkmallocの()EDの多くは、(代わりvmallocのメモリを得るために)、これは、パフォーマンス上の理由から主にある。vmalloc()関数の物理用ページの連続仮想アドレスに不連続なページ、あなたは特別なページテーブルエントリを確立する必要があり、さらに悪い、vmalloc(によって得られたページ)は、ダイレクト・メモリ・マップよりもはるかに大きいにつながる一つ一つを、マッピングする必要がありますTLBを振る。このような理由のために、vmalloc()は最後の手段で使用されている - 典型的な大容量のメモリを取得することです。

vmalloc()関数は、<リナックス/ vmalloc.h>で宣言され、以下のように、プロトタイプは以下のとおりです。

1  無効 * vmalloc(符号なしの長いサイズ)。

この関数は、メモリの論理的に連続した領域へのポインタを返す少なくともサイズの大きさ、エラーが発生したときにNULLを返し、スリープ機能は、従って、割り込みコンテキストから呼び出されないことがあり、また他の場合阻止許可します呼び出します。

vmallocによって得られた空きメモリ()するには、以下の機能を使用する必要があります。

1  ボイド vfree(constの ボイド * addrに)

この関数は、addrがvmallocによって返されたメモリアドレスのブロックであるADDR、始まるメモリブロックを解放する。この関数はまた、従って、割り込みコンテキストから呼び出すことができない眠ることができます。

 

おすすめ

転載: www.cnblogs.com/wanpengcoder/p/11761070.html