1

我想编写一个简单的“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

4

我将计数器变量定义为 extern int inkernel/defs.h并在系统调用定义中使用它作为返回值 inkernel/sysproc.c并在所有陷阱处理完成的地方增加它kernel/syscall.c。我希望它有所帮助。

于 2013-09-16T20:13:47.967 回答
1

这需要编辑 entry.S 文件。上次我使用内核时,它在.../arch/kernel/目录中。在该文件中,它首先验证系统调用,即使用call指令调用它。您必须在此验证之后和实际执行系统调用之前执行操作。

您不必担心如何访问 User Land 中的变量,该 entry.S 中有基本指针。

顺便说一句,这是调用系统调用的“新”方式(感谢 P II+ 处理器).. 最初曾经有软件中断int 0x80。因此,还要检查您正在使用的内核版本。

我在这里可能是错的。我只是根据一些知识解释一种方式(这可能是最糟糕的和/或错误的)。如果 You/someone_else 实现了这个,请用最少的代码发布成功/失败。

一旦我从 Windows 中抽出时间(机会较少),我将自己编写这段代码。

于 2013-09-16T06:32:02.417 回答