簡體   English   中英

在entry.S中改變system_call時出現內核恐慌

[英]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

我猜想%eaxupdate_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM