【发布时间】:2013-09-16 05:45:31
【问题描述】:
我想编写一个简单的“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
【问题讨论】:
-
你是什么意思 - “我正在关注其他系统调用,如 fork() 或 getpid() 并且基本上复制了他们的大部分内容”?如果你有一些代码,请发布它。
-
@VivekS 遵循pdos.csail.mit.edu/6.828/2012/xv6.html 中的 xv6 代码,您可以为简单的系统调用编写所有必要的(基本)代码。例如,我使用“grep -irn getid *”命令跟踪 getpid,并尝试跟踪它的定义/使用位置,并对我自己的系统调用执行相同操作。但是我不确定当我们调用系统陷阱时是否应该简单地调用一个计数器。或者我们应该如何在启动后实现系统调用次数。
-
您打算在哪里增加计数器?在你的代码里面?陷阱是操作系统的软件中断,用于更改上下文并执行内核中存在的功能以完成某些工作。因此,每个系统调用都会发出一个陷阱,这些函数分布在许多文件中,包括 glibc 以及其他文件。如果我不理解您的问题,请纠正我。
-
sys_getsyscallinfo 中的计数器在哪里定义? counter 是在 syscall 中定义的局部变量,当您从用户空间调用系统调用时,它会调用 sys_getsyscallinfo(假设这是您的系统调用)。你知道系统调用是如何在操作系统中处理的吗?
标签: c linux operating-system posix fork