Паника ядра при изменении system_call в entry.S - PullRequest
3 голосов
/ 25 марта 2010

Я пытаюсь реализовать счетчик системных вызовов, и в результате я включил значение int в task_struct и функцию, которая увеличивает его в отдельном файле. Предполагается, что эта функция вызывается из system_call непосредственно перед тем, как она на самом деле вызывает требуемый sys_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

1 Ответ

2 голосов
/ 25 марта 2010

Я думаю, что %eax уничтожается при вызове update_counter. В частности, если это функция C (а не рукописная сборка), тогда соглашения о вызовах означают, что она почти наверняка будет изменена: %eax определено либо для возврата результата (или его части), либо (в других случаях , например, функция, возвращающая void), будет свободна для вызываемого абонента без ее сохранения.

Попробуйте:

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