我正在尝试实现一个系统调用计数器,因此我在task_struct中包含了一个int值,并在一个单独的文件中将它递增。这个函数应该在它实际调用所需的sys_call之前从system_call调用(我有理由在之前调用它而不是之后调用它)。但是,如果我将它放在sys_call之前,那么在编译和引导之后就会出现内核恐慌(“试图杀死init_idle”),如果我把它放在sys_call之后,它就可以了。有什么区别,我该如何克服这个?
这是相关代码
ENTRY(system_call)
pushl %eax # save orig_eax
SAVE_ALL
GET_CURRENT(%ebx)
testb $0x02,tsk_ptrace(%ebx) # PT_TRACESYS
jne tracesys
cmpl $(NR_syscalls),%eax
jae badsys
call update_counter /*This causes a kernel panic*/
call *SYMBOL_NAME(sys_call_table)(,%eax,4)
movl %eax,EAX(%esp) # save the return value
答案 0 :(得分:2)
我猜这个%eax
的调用正在摧毁update_counter
。特别是,如果那是一个C函数(而不是手写的程序集),那么调用约定意味着它几乎肯定会被更改:%eax
被定义为返回结果(或部分结果),或者(其他情况,例如返回void
的函数)可供被调用者免费使用而不保留它。
尝试:
...
pushl %eax
call update_counter
popl %eax
call *SYMBOL_NAME(sys_call_table)(,%eax,4)
...