1

OSの起動後にシステムコールの数を見つけるための簡単な「C」プログラムを書きたいです。私は fork() や getpid() などの他のシステム コールに従っており、基本的にそれらのほとんどをコピーしています。どこで、いつカウンターを増やせばよいかわかりません。例はありますか?

kernel/syscall.c でカウンターを定義し、それに応じてインクリメントするのは良い考えですか?

void
syscall(void)
{
  int num;
  counter++; //mona
  num = proc->tf->eax;
  if(num > 0 && num < NELEM(syscalls) && syscalls[num] != NULL) {
    proc->tf->eax = syscalls[num]();
  } else {
    cprintf("%d %s: unknown sys call %d\n",
            proc->pid, proc->name, num);
    proc->tf->eax = -1;
  }
}

また、これまでのところ、kernel/sysproc.c で簡単なシステム コール用に取得したコードを次に示します。

sys_getsyscallinfo(void)
{

 return counter;  //mona
}

ただし、次のエラーが表示されます。

kernel/sysproc.c: In function ‘sys_getsyscallinfo’:
kernel/sysproc.c:48: error: ‘counter’ undeclared (first use in this function)
kernel/sysproc.c:48: error: (Each undeclared identifier is reported only once
kernel/sysproc.c:48: error: for each function it appears in.)
make: *** [kernel/sysproc.o] Error 1
4

2 に答える 2

1

これには、entry.S ファイルを編集する必要があります。前回カーネルを使用したときは、.../arch/kernel/ディレクトリにありました。そのファイルでは、最初にシステムコールを検証し、call命令を使用して呼び出します。この検証の後、システムコールが実際に投入される前に、何かをする必要があります。

ユーザー ランドの変数にアクセスする方法について心配する必要はありません。そのエントリにはベース ポインターがあります。

ところで、これはシステム コールを呼び出す「新しい」方法です (P II+ プロセッサのおかげです)。最初は、ソフトウェア割り込みが使用されていましたint 0x80。そのため、作業しているカーネルのバージョンも確認してください。

私はここで間違っているかもしれません..私は、いくつかの知識に基づいて、1つの方法(おそらく最悪および/または間違っている)を説明しているだけです. あなた/誰かがこれを実装する場合は、最小限のコードで成功/失敗を投稿してください。

Windows から時間が取れたら (可能性は低いです)、このコードを自分で書きます。

于 2013-09-16T06:32:02.417 に答える