Lions' 本メモ
savu とか retu とかの確認。
savu
まずこちらから。定義が以下。
0725 _savu: 0726 bis $340,PS 0727 mov (sp)+,r1 0728 mov (sp),r0 0729 mov sp,(r0)+ 0730 mov r5,(r0)+ 0731 bic $340,PS 0732 jmp (r1)
0726 および 0731 は今はスルーさせて下さい。というか別途確認。今は理解できてる部分のみ、ということにて。
jsr 命令で savu は呼び出されるはずなので stack のてっぺんには戻り番地 (jsr 命令の次の命令の番地) が格納されているので、それを r1 レジスタに入れて ++ するのが 0727 で、次の 0728 は引数で渡されてくる user 構造体の u_rsav 属性の番地を r0 に退避するのか。
次の二行で sp を r_rsav[0] に格納して r5 を r_rsav[1] に格納してますね。この_環境ポインタ_と呼ばれている r5 の取り扱いも注意してみてみると面白いのかどうなのか。
で、0732 で呼び出し元に jmp してますね。ということは savu というのは引数で渡した u.u_rsav な領域に現在の sp (r6) と r5 を格納するんですね。
retu
次、定義が以下。
0740 _retu: 0741 bis $340,PS 0742 mov (sp)+,r1 0743 mov (sp),KISA6 0744 mov $_u,r0 0745 1: 0746 mov (r0)+,sp 0747 mov (r0)+,r5 0748 bic $340,PS 0749 jmp (r1)
こちらも 0741 および 0748 は略で。retu には proc 構造体の p_addr 属性が渡されます。Lions' 本の p.313 には
引数として渡された値をセグメント#6 に対するカーネルアドレスレジスタに再設定し (これによってカレントプロセスが変更される)、
Lions' Commentary On UNIX より引用
proc[0] の初期設定をしてる 1589 な記述に
p_addr は、カーネルセグメンテーションアドレスレジスタ #6 の内容を設定する。
Lions' Commentary On UNIX より引用
とあったので該当行を確認してみたら
1589 proc[0].p_addr = *ka6;
とのこと。クロスリファレンス見たら情報あり。定義が 322 で以下。
322 int *ka6; /* 11/40 では KISA6、11/45 では KDSA6 */
むむ。ってクロスリファレンスよく見てみたら KISA6 の記述もありますね。
閑話休題
p_addr 属性が定義されてる場所に記述されてるコメントは_スワップ可能イメージのアドレス_とありますね。一応プロセス #0 はこの属性に *ka6 を格納してるんですよね。上に引用してますね。
話を元に戻すと、0742 で戻り番地を r1 に退避して、引数として渡された proc 構造体の p_addr 属性を KISA6 に格納してます (0743)。で、r0 レジスタに _u な 014000 番地に展開されてる user 構造体な番地を格納してるのかな (0744)。
で、u_rsav[0] を sp (r6) に (0746)、u_rsav[1] を r5 に (0747) 格納してます。savu の逆ですね。で、呼び出し元に jmp する (0749) という事になってます。
次は
p_addr 属性かなぁ。色々なものにフォーカスしていきつつ読んでいくと、なんとなく理解が深まっていくカンジです。
TODO
p_addr 属性云々は newproc 手続きがキモなカンジなのかどうか。sched 手続きも。あと savu/retu なナニ的には swtch 手続きもアレ。expand 手続きもですね。exec 手続きでも同様にこれを元に何かをしてます。
これは掘りがいのある課題かも。