syscall.c int argint(int n, int *ip)

トップページ
jupiteroak.hatenablog.com


syscall.c
https://github.com/mit-pdos/xv6-public/blob/master/syscall.c#L49

int argint(int n, int *ip)
{
  return fetchint((myproc()->tf->esp) + 4 + 4*n, ip);
}

argint関数は、現在実行中のプロセスが呼び出しているシステムコールの引数(4バイト)を取得します。取得したシステムコールの引数は、アドレスipが指定するモリ領域に格納されます。

引数 int n,
取得したいシステムコールの引数番号-1の値です。

引数 int *ip
取得したシステムコールの引数が格納されるメモリ領域を指定したアドレスです。

戻り値 0 または -1
システムコールの引数を取得できた場合は、0が戻り値とまります。
システムコールの引数を取得できなかった場合は、-1が戻り値となります。


処理の内容

return fetchint((myproc()->tf->esp) + 4 + 4*n, ip);

システムコールを呼び出す手続きで、ユーザプロセスのスタック領域に退避させた第n+1番目の引数の値(4バイト)を取得します。
myproc()->tf->espは、現在実行中のプロセスがユーザモードの時に使用していたスタックのトップアドレスです。
myproc()->tf->espが指定するメモリ領域には、リターンアドレス(サブルーチンを呼び出した時のプログラムカウンタの値)が格納されています。
(myproc()->tf->esp) + 4 が指定するメモリ領域には、システムコール関数の第1引数の値が格納されています(nが0の時)。
(myproc()->tf->esp) + 4 + 4*nが指定するメモリ領域には、システムコール関数の第n+1引数の値が格納されています。
取得した値は、アドレスipで指定されたメモリ領域に格納されます。