在xv6中内核启动后如何获取系统调用次数?

时间:2013-09-16 05:45:32

标签: c linux operating-system posix fork

我想编写一个简单的“C”程序来查找OS启动后的系统调用次数。我正在关注其他系统调用,如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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

您无需担心如何在User Land中访问变量,该条目中有基指针。

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

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

一旦我从Windows中获得时间(可能性更小),我将自己编写此代码。