memo
体調悪い。へろへろなんですがメモ。
デバイスドライバな課題。
仮想 FIFO なデバイスのためのドライバを云々との事。バッファの容量を越える書き込みに対応するために sleep() だの wakeup() だのが必要との事ですが、こうしたナニが 2.6 系でどうなのか。
ググッたら プロセスのBlockとWakeup というドキュメントに hit。DECLARE_WAITQUEUE というマクロは include/linux/wait.h にて定義されている。
#define __WAITQUEUE_INITIALIZER(name, tsk) { \ .private = tsk, \ .func = default_wake_function, \ .task_list = { NULL, NULL } } #define DECLARE_WAITQUEUE(name, tsk) \ wait_queue_t name = __WAITQUEUE_INITIALIZER(name, tsk)
ちなみに wait_queue_t は
typedef struct __wait_queue wait_queue_t;
と定義。struct __wait_queue は以下
struct __wait_queue { unsigned int flags; #define WQ_FLAG_EXCLUSIVE 0x01 void *private; wait_queue_func_t func; struct list_head task_list; };
サンドイッチされてる define は何だろ。struct list_head は include/linux/list.h にて定義
struct list_head { struct list_head *next, *prev; };
あと、default_wake_function は kernel/sched.c にて以下の定義
int default_wake_function(wait_queue_t *curr, unsigned mode, int sync, void *key) { return try_to_wake_up(curr->private, mode, sync); } EXPORT_SYMBOL(default_wake_function);
ちょっとまだ具体的な方法が見えてません。大体が open したプロセスをドライバがどうやって知るのか、が分からねぇ。
色々見てるに sleep_on() とか wake_up() なんてのはまだある模様。
void fastcall __sched sleep_on(wait_queue_head_t *q) { SLEEP_ON_VAR current->state = TASK_UNINTERRUPTIBLE; SLEEP_ON_HEAD schedule(); SLEEP_ON_TAIL } EXPORT_SYMBOL(sleep_on);
これは open したプロセスをドライバが知らなくても良いな。ってか current って何だ。