デバイスドライバは、自分で動作させることができるすべての接続デバイスを同時に処理する準備ができている必要があります。ドライバが処理するデバイスの数には制限がありません。デバイスごとの情報をすべて動的に割り当てる必要があります。
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) を呼び出すために、割り当てられた各オブジェクトのサイズを追跡して記録する必要があります。