しまった

昨晩メモった sleep_on() がどこで定義されているのか失念。
と思ったら kernel/sched.c だった。あと、wake_up はマクロになってて include/linux/wait.h で以下の定義

#define wake_up(x)			__wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 1, NULL)
#define wake_up_nr(x, nr)		__wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, nr, NULL)
#define wake_up_all(x)			__wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 0, NULL)

ええと、単純に wake_up じゃ駄目なのかなぁ。current 取っといて云々、なのかなぁ。このあたりは色々試験で確認できそげ。

仕様確認

ええと

デバイスのマイナー番号 2N 個を実装するとき、作成するドライバは N 個の FIFO キュー (N = 4) を実装する。

とある。意味が分からない。(鬱
面倒なので勝手に解釈しちゃれ。mknod で /dev/fifo1000 と /dev/fifo1010 を使うとしたら fifo1000 が書き込み用で fifo1010 が読み込み用。
デバイスファイルを直接 open して云々なのか。

もう少し

結構へろへろ。とりあえず device のメジャー番号の検討が必要。これ、色々試すには面白い課題なのは分かるのですが、知識不足が激し杉。
なんか使い方が逆なので微妙なのだろうか

  • read はドライバが持ってる情報をユーザに渡す
  • write はユーザからもらった情報をデバイスに渡す

という理解で良いのかな。しかし

  • read はプロセスをブロック
  • write ブロックされているプロセスを起こす

なんか微妙。write で受け取ったバッファが巨大だったらどうするんだろ。受け取り可能な領域サイズでコピーして write な current 止め (sleep_on) て read な current を開始 (wake_up) するんだろうか。デフォで read は一旦停止 (sleep_on) するんかな。って誰が write な current を start (wake_up) するんだ??
# 多分自分。

簡単なソレから

実装しつつ試験しつつ、なログが残せれば良いのですが。
しかし殴り書きだな (とほほ
でも簡単な例で言えば

$ cat /dev/fifo1010

しつつ

$ cat >/dev/fifo1000

すれば下側でタイプした文字が上側で出力されるはず。

確かに

デバイスが複数になってくると管理が面倒だな。一つのドライバで複数の fifo を管理するのは色々と微妙ですが題材としては面白そげ。