13

XV6 で単純な優先度ベースのスケジューラを作成しようとしています。これを行うには、プロセスが優先度を設定できるようにするシステム コールも作成する必要があります。ここや他の場所で説明されているように、システム コールを作成するために必要なすべてのことを行いました。

xv6 でシステム コール / ユーティリティを追加するにはどうすればよいですか

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

外部宣言 (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 にはシステム コールを介して値を渡す組み込みのメカニズムがないと考え始めています。何か不足していますか?前もって感謝します。

4

1 に答える 1

22

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

argint(0, &pid);

... プロセス ID である最初の引数を取得するには、次のようにします。

argint(1, &pty);

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

setpty(getpid(), priority);
于 2014-11-25T00:55:39.547 に答える