我想编写一个简单的“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
答案 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中获得时间(可能性更小),我将自己编写此代码。