[英]Kernel panic when altering system_call in entry.S
我正在嘗試實現一個系統調用計數器,因此我在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
我猜想%eax
被update_counter
的調用破壞了。 特別是,如果那是一個C函數(而不是手寫程序集),那么調用約定意味着它幾乎肯定會被更改: %eax
被定義為返回結果(或部分結果),或者(在其他情況下,例如,返回void
的函數)可以自由地讓被調用者使用而不保留它。
嘗試:
...
pushl %eax
call update_counter
popl %eax
call *SYMBOL_NAME(sys_call_table)(,%eax,4)
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.