2010-03-24 14 views
3

J'essaie d'implémenter un compteur d'appels système, et par conséquent j'ai inclus une valeur int dans task_struct, et une fonction qui l'incrémente dans un fichier séparé. Cette fonction est supposée être appelée à partir de system_call juste avant qu'elle appelle réellement le sys_call requis (j'ai mes raisons de l'appeler avant et non après). Cependant, si je le place avant le sys_call, après la compilation et le démarrage, il y a un kernel panic ("essayé de tuer init_idle"), et si je le place juste après le sys_call, cela fonctionne. Quelle est la différence et comment puis-je surmonter cela?Panique du noyau lors de la modification de system_call dans entry.S

Voici le code correspondant

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 

Répondre

2

Je suppose que %eax est en cours saccagé par l'appel à update_counter. En particulier, si c'est une fonction C (plutôt qu'un assemblage manuscrit), alors les conventions d'appel signifient qu'elle sera presque certainement modifiée: %eax est défini soit pour renvoyer le résultat (ou une partie de celui-ci), ou (dans d'autres cas, tel en tant que fonction retournant void) être libre pour l'appelé à utiliser sans le préserver.

Essayez:

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

J'ai essayé de faire SAVE_ALL et RESTORE_ALL juste avant et après update_counter d'appel, et maintenant il ne panique pas, mais ne démarre pas, soit (retourne à la sélection du noyau de GRUB). – EpsilonVector

+0

OK J'ai essayé d'économiser eax comme vous l'avez suggéré et cela a fonctionné. Étrange. – EpsilonVector