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 手続きでも同様にこれを元に何かをしてます。
これは掘りがいのある課題かも。