LINUX.ORG.RU

Сообщения LivKo

 

синхронизация функций в загружаемом модуле ядра

Форум — Development

Добрый День.

У меня в загружаемом модуле ядра, происходит подмена одного системного вызова на другой(через таблицу системных вызовов). При закрытии модуля, я возвращаю адреса как и было вначале. Проблем в том, что если я начну обратно менять адреса, а в это время будет выполняться тот самый вызов, то будет ошибка. Как я понимаю мне надо использовать семафор, ожидающий, когда завершится системный вызов, и после уже разрешающий поменять адреса в таблице обратно. Но как я понял семафоры в ядре работают по другому. Вот пример моего кода. Пожалуйста, помогите исправить вылет при выгрузке модуля. Ядро 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);

LivKo
()

RSS подписка на новые темы