Добрый День.
У меня в загружаемом модуле ядра, происходит подмена одного системного вызова на другой(через таблицу системных вызовов). При закрытии модуля, я возвращаю адреса как и было вначале. Проблем в том, что если я начну обратно менять адреса, а в это время будет выполняться тот самый вызов, то будет ошибка. Как я понимаю мне надо использовать семафор, ожидающий, когда завершится системный вызов, и после уже разрешающий поменять адреса в таблице обратно. Но как я понял семафоры в ядре работают по другому. Вот пример моего кода. Пожалуйста, помогите исправить вылет при выгрузке модуля. Ядро 2.6.
Мне надо дождаться завершения new_sys_write и уже потом менять адреса в interceptor_end() вот тут: (sys_call_table[__NR_write] = (unsigned long *)ref_sys_write;)
код:
unsigned long **sys_call_table;
asmlinkage long (*ref_sys_write)(unsigned int fd, const char __user *buf, size_t count);
asmlinkage long new_sys_write(unsigned int fd, const char __user *buf, size_t count)
{
// тут я вызываю настоящий вызов, чтобы после проанализировать его результат.
long k = ref_sys_write(fd, buf, count);
MyAnalyzeFunc(k, count);
return k;
}
static int __init interceptor_start(void)
{
disable_page_protection();
ref_sys_write = (void *)sys_call_table[__NR_write];
sys_call_table[__NR_write] = (unsigned long *)new_sys_write;
enable_page_protection();
return 0;
}
static void __exit interceptor_end(void)
{
if(!sys_call_table) return;
disable_page_protection();
sys_call_table[__NR_write] = (unsigned long *)ref_sys_write;
enable_page_protection();
}
module_init(interceptor_start);
module_exit(interceptor_end);