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 手続き) どうなんだろうか。

おそらくは

ここ、スルーして読みすすめた方が良さげ。