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が指定するポインタから参照できるようにします。