2009年10月19日月曜日

kmalloc()/kfree()

カーネル内でメモリを確保/解放するための関数

●使い方
 #include <slab.h>
 void* kmalloc( size_t size, int flags );
 void kfree( void* ptr );
sizeには確保したいバイト数,flagsには以下のどちらかを指定.
GFP_KERNEL:即座にメモリ領域を用意できない場合、メモリ管理機能がスワップアウト 等によって領域を確保するまでスリープする可能性がある
GFP_ATOMIC:スリープせずにメモリ領域を確保しようとする。 必要な領域が確保できない場合は失敗する。 割り込みハンドラやタスクレット、タイムアウトハンドラ等の プロセスコンテキストと無関係に実行される箇所ではこれを使う

●例
u8 *buffer;
buffer = kmalloc(1000, GFP_ATOMIC);
if (!buffer)
 return -ENOMEM;
kfree(buffer);

/*u8とは符号なし1バイト整数型(0~255)を表す基本型.
 <linux/types.h>をincludeして利用する*/


●参照ページ:
カーネルモジュールを作る