gpt4 book ai didi

linux - 更改 entry.S 中的 system_call 时内核 panic

转载 作者:太空狗 更新时间:2023-10-29 11:16:43 34 4
gpt4 key购买 nike

我正在尝试实现一个系统调用计数器,结果我在 task_struct 中包含了一个 int 值,并在一个单独的文件中包含了一个递增它的函数。这个函数应该在它实际调用所需的 sys_call 之前从 system_call 调用(我有理由在之前而不是之后调用它)。但是,如果我将它放在 sys_call 之前,那么在编译和启动之后就会出现内核 panic (“试图杀死 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

最佳答案

我猜测 %eaxupdate_counter 调用破坏了。特别是,如果这是一个 C 函数(而不是手写汇编),那么调用约定意味着它几乎肯定会被更改:%eax 被定义为返回结果(或部分结果) , 或者(在其他情况下,例如返回 void 的函数)被调用者可以自由使用而不保留它。

尝试:

...
pushl %eax
call update_counter
popl %eax
call *SYMBOL_NAME(sys_call_table)(,%eax,4)
...

关于linux - 更改 entry.S 中的 system_call 时内核 panic ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2512239/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com