2016-09-02 14 views
0

カーネル空間でmallocを使用できますか?そして、メモリの一部でkmalloc関数を使用すると、割り当てが行われますか?私がドライバプログラムを書いているのであれば、そのプログラムで取っている変数は、通常の変数関数のようなユーザ空間と同じ方法でスタックに配置され、初期化されたデータセクションと初期化されていないデータセクションに静的に割り当てられるか、メモリのどの部分に格納されるのかが異なって格納されますか?カーネル空間内のmalloc関数

上記のことを明確にしてください。デバイスドライバプログラムを使用しているときに問題が発生しています。

答えて

1

まあ、おそらくあなたに興味がないWindowsドライバの経験があります。しかし、私は両方のOSで状況が似ていると思う。

  • ローカル変数は

  • グローバル/静的なものは、カーネルドライバイメージのデータセクションに、スタック上に割り当てられています。

つまり、ユーザスペースと同じルールです。 Windowsの世界では、ドライバイメージ全体がいわゆる常駐メモリブロックに置かれます。ブロックはディスクにページアウトされず、別の物理メモリの場所に移動されることもありません。

kmalloc(WIndowsのExAllocatePoolXxx)は、メモリブロック(通常は1ページ未満)を割り当てるルーチンのmallocルーチンに相当します。ユーザ空間mallocとは異なり、kenrelの亜種は追加のオプションを指定することができます。

たとえば、ルーチンでは、割り当てられたメモリブロックが常駐する必要があるかどうかを指定できます。 Linuxカーネルの亜種(kmalloc)には、はるかに多くのオプションが用意されています:http://www.makelinux.net/books/lkd2/ch11lev1sec4

ページサイズより大きなメモリブロックを割り当てる必要がある場合は、他の方法でカーネルメモリを割り当てることをお勧めします。

+0

ここで心配しておきたいのは、システムがどのようにシステムを区別するのかを記述するプログラムがカーネルコードであり、これが内部的にユーザー空間コードであることを理解することです。インターネットのドキュメントから理解しようとしているが、トピックの明確な抽象化を得ていない –

関連する問題