Oracle® Solaris 11.2 デバイスドライバの記述

印刷ビューの終了

更新: 2014 年 9 月
 
 

動的メモリー割り当て

デバイスドライバは、自分で動作させることができるすべての接続デバイスを同時に処理する準備ができている必要があります。ドライバが処理するデバイスの数には制限がありません。デバイスごとの情報をすべて動的に割り当てる必要があります。

void *kmem_alloc(size_t size, int flag);

標準的なカーネルメモリー割り当てルーチンは、 kmem_alloc(9F) です。kmem_alloc() は C ライブラリルーチン malloc(3C) に似ていますが、flag 引数が追加されています。flag 引数には、要求されたサイズが使用できない場合に呼び出し側がブロックするかどうかを示す KM_SLEEP または KM_NOSLEEP を指定できます。KM_NOSLEEP が設定されていて、メモリーが使用できない場合、kmem_alloc(9F)NULL を返します。

kmem_zalloc(9F) kmem_alloc (9F) に似ていますが、割り当てられたメモリーの内容もクリアします。


注 - カーネルメモリーは限られたリソースであり、ページング不可能なため、物理メモリーをめぐってユーザーアプリケーションやカーネルの残りの部分と競合します。ドライバが大量のカーネルメモリーを割り当てると、システム性能が低下する可能性があります。

void kmem_free(void *cp, size_t size);

kmem_alloc(9F) または kmem_zalloc (9F) によって割り当てられたメモリーは、 kmem_free(9F) を使ってシステムに返されます。kmem_free() は C ライブラリルーチン free (3C) に似ていますが、size 引数が追加されています。ドライバは、あとで kmem_free(9F) を呼び出すために、割り当てられた各オブジェクトのサイズを追跡して記録する必要があります