1. ホーム
  2. c

[解決済み] XV6でシステムコール関数に値を渡すにはどうしたらいいですか?

2022-02-14 14:38:41

質問内容

XV6でシンプルなプライオリティベースのスケジューラーを作ろうとしています。 これを行うには、プロセスが優先順位を設定できるようなシステムコールも作成しなければなりません。 ここや他の場所で議論されているように、システムコールを作成するために必要なことはすべて行いました。

XV6でシステムコール/ユーティリティを追加する方法

問題は、関数を呼び出すときに変数を渡すことができない、というか、何も問題がないように実行されるのですが、正しい値が関数内に表示されないことです。

Extern宣言(syscall.c)。

...
extern int sys_setpty(void);

static int (*syscalls[])(void) = {
...
[SYS_setpty]  sys_setpty,
};

シスコールベクター(syscall.h)。

#define SYS_setpty 22

実装(sysproc.c)です。

void
sys_setpty(int pid, int pty)
{
  cprintf("function pid: %d \n", pid);
  cprintf("function pty: %d \n", pty);
}

(defs.h & user.h)を参照してください。

void setpty(int, int);

マクロ(usys.S)です。

SYSCALL(setpty)

関数呼び出し。

setpty(3, 50);

出力します。

function pid: 16843009
function pty: 16843009

値はいつも16843009と正確に同じ数字です。 pidとptyに値を代入して、cprintfが正しく動作しているかどうか確認しました。 思いつく限りのあらゆる組み合わせを6時間ほどかけて試してみましたが、XV6にはシステムコールで値を渡す仕組みが組み込まれていないのではと思い始めています。 私は何かを見逃しているのでしょうか? よろしくお願いします。

解決方法は?

XV6では、ユーザーレベル関数からカーネルレベル関数への引数の受け渡しができません。 XV6には、カーネル関数に引数を渡すための独自の組み込み関数があります。 例えば、整数を渡すには、argint()関数が呼ばれます。 set-priority関数に使った実装では、次のようになる。

argint(0, &pid);

...最初の引数であるプロセスIDを取得し

argint(1, &pty);

...で、2番目の引数として希望する優先度を取得します。ユーザープロセスからの関数呼び出しは次のようになります。

setpty(getpid(), priority);