Lions' 本読み (147)
空き時間に何故か思いだしたようにこちら対応。つうか直前エントリが非常に分かりづらい (というかわしの Lions' エントリは基本分かりづらい)。
とりあえず open1 手続きを再確認してみます。
いくつか前提を控え。
- namei 手続きが戻すのは struct inode 型のポインタ
- open1 手続きの引数 ip は struct inode 型のポインタが渡される
- namei で struct inode 型のオブジェクトが LOCK されるらしく prele 手続きを呼び出す必要がある模様
- falloc 手続きで u.u_ofile の先頭空きエントリに struct file な構造体配列の先頭空きエントリな要素を設定
- 中で呼び出される ufalloc において u.u_ofile の先頭空きエントリのインデクスが u.u_ar0[R0] に格納
む、以下 (5831 な退避) が何故に必要なのか、というあたりが微妙。
5831 i = u.u_ar0[R0]; 5832 openi(rip, m&FWRITE); 5833 if(u.u_error == 0) 5834 return; 5385 u.u_ofile[i] = NULL;
ここ、システムコールの中なので割り込みは基本入らないはず。違うのかな。openi 手続きで u.u_ar0[R0] が云々なのかというとそうでもないし。
泥沼状態のまま、時間が過ぎていく。
追記
openi から呼び出されているブロックデバイスな d_open は空の手続きです。キャラクタデバイスな d_open は
- klopen
- pcopen
- lpopen
というナニが割り当てられています。見てみると pcopen で sleep してるんですが、これ大丈夫なのかな。なんとなく sleep なブロックは通過しなさげ。
lpopen から呼び出される手続きあたりに怪しげな何かがあるのですが (lpoutput 手続き) どうなんだろうか。
おそらくは
ここ、スルーして読みすすめた方が良さげ。