Lions' 本読み (77)

ssig とか kill なあたりを確認しててシステムコールな引数の取り扱いがワケワカになってしまったので諸々確認します。
例えば kill の記述の一部を引用すると

3637    a = u.u_ar0[R0];

引数からプロセス id を a に代入している模様。そして psignal を呼び出すあたり。

3649            psignal(p, u.u_arg[0]);

あら、u.u_arg って何だっけ、と言いつつ C の trap を確認してみたら引数はここに格納されてる事が判明 (実装の引用は略)。
てことは u.u_ar0[R0] って何、という話か。

man 2 kill 見てみた

プロトタイプは以下らしい。

       int kill(pid_t pid, int sig);

ええと最初の引数は u.u_ar0[R0] で二つ以上あるのであれば u.u_arg に順に格納される、ってことなのか。でも C な trap 手続きに u.u_ar0[R0] に云々な記述が無いな、と思ったら以下がそれに当たるのかな。

2701    u.u_ar0 = &r0;

これによって u.u_ar0[R0] は r0 な引数を参照できる、はず。

ちょっとマテ

そもそも引数な r0 には何が入ってるのか、という話なんですが、システムコールな定義を見てみるに色々な意味でばらばら。むむむ、と言いつつ 353p 見てたら以下な記述が。

sysent で指定された引数の数は、ユーザープログラマから与えられた実際の数か、あるいは、引数のうち 1 つを r0 で渡す場合はその数より 1 少ない数である。

(Lions' Commentary on UNIX より引用)
何ですと。

結局 r0 な引数の値は何なのか、という件

ええと、スタックに push されるのは

0762    jsr     r0,call1; _trap

な部分で

  • r0 を stack に積む
  • r0 は _trap のアドレスが設定
  • PC は call1 のアドレスが設定

とのことなんですが、この瞬間の r0 ってorz
このあたりはマニュアルよく見なさい、という世界なのかどうなのか。