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で指定されたメモリ領域に格納されます。