syscall.c int argstr(int n, char **pp)
トップページ
jupiteroak.hatenablog.com
syscall.c
https://github.com/mit-pdos/xv6-public/blob/master/syscall.c#L76
int argstr(int n, char **pp) { int addr; if(argint(n, &addr) < 0) return -1; return fetchstr(addr, pp); }
argstr関数は、現在実行中のプロセスが呼び出しているシステムコールの引数(ヌル終端文字列)を取得します。取得したシステムコールの引数(ヌル終端文字列)は、アドレスppが指定するポインタから参照できます。
引数 int n
取得したいシステムコールの引数番号-1の値です。
引数 char **pp
システムコールの引数(ヌル終端文字列)を参照するポインタを指定するアドレスです。
戻り値 ヌル終端文字列のサイズ(ヌル文字を除く) または -1
システムコールの引数(ヌル終端文字列)を取得できた場合は、ヌル終端文字列のサイズ(ヌル文字を除く)が戻り値となります。
システムコールの引数(ヌル終端文字列)を取得できなかった場合は、-1が戻り値となります。
処理の内容
システムコールの引数(アドレス値)を取得する
if(argint(n, &addr) < 0) return -1;
argint関数を呼び出して、現在実行中のプロセスが呼び出しているシステムコールの引数(4バイトサイズのアドレス値)を取得します。取得したシステムコールの引数(4バイトサイズのアドレス値)は、アドレス&addrが指定するメモリ領域(addr)に格納されます。
argint(n, &addr) < 0が真となる場合→argint関数の戻り値が-1となる場合→システムコールの引数を取得できなかった場合は、-1を戻り値として処理を終了します。
システムコールの引数(アドレス値)を使ってヌル終端文字列をアドレスppが指定するポインタから参照できるようにする
return fetchstr(addr, pp);
fetchstr関数を呼び出して、プロセスのユーザ空間にあるアドレスaddrが指定するメモリ領域に格納されたヌル終端文字列を、アドレスppが指定するポインタから参照できるようにします。