Я новичок в разработке ядра. Я пытаюсь выяснить, могу ли я сделать вызов функции из раздела __ init . Но после сборки модуля, когда я использую insmod XXX.ko , чтобы вставить мой модуль, моя система не отвечает. Я должен перезагрузить мою машину. Я следую решению и подходу из этого вопроса, но это не помогло.
Вот мой исходный код для секции __ init , __ exit и test_read функция, которую я пытаюсь вызвать:
unsigned long test_read(const struct pt_regs *regs){
printk(KERN_INFO "Inside test_read");
unsigned int fd = regs->di;
char *buf = (char*) regs->si
unsigned long r=1;
char *kbuf=(char*)kmalloc(256,GFP_KERNEL);
printk(KERN_INFO "File descriptor\n");
printk(KERN_CONT "%lu",fd);
printk(KERN_INFO "User Buffer\n");
printk(KERN_CONT "%p",buf);
return r;
}
static int __init kit_start(void)
{
sys_call_table = kallsyms_lookup_name("sys_call_table");
printk(KERN_INFO "System call address ");
printk(KERN_CONT "%p",sys_call_table);
original_read = (void *)sys_call_table[__NR_read];
printk(KERN_INFO "Original read address ");
printk(KERN_CONT "%p",original_read);
register uint64_t cr0;
cr0 = getcr0();
rw_enable();
sys_call_table[__NR_read]=test_read;
rw_disable( cr0 );
return 0;
}
void __exit kit_exit(void)
{
printk(KERN_INFO "Exiting");
register uint64_t cr0;
cr0 = getcr0();
rw_enable();
sys_call_table[ __NR_read ] = original_read;
rw_disable( cr0 );
}
Полный исходный код доступен здесь . Есть идеи, что я сделал не так. Я использую x86-64 с 5.3.0-42-generi c ядро
Обновление сообщения:
Вместо использования rw_enable () и rw_disable (cr0 ), если я использую
write_cr0 (read_cr0 () & (~ 0x10000));
sys_call_table[__NR_read]=test_read;
write_cr0 (read_cr0 () | 0x10000);
При использовании insmod для вставки модуля терминал отображает " Killed " и dmesg показывает ошибку при попытке выполнить sys_call_table [__NR_read] = test_read;
BUG: unable to handle page fault for address: ffffffff820002a0
#PF: supervisor write access in kernel mode
#PF: error_code(0x0003) - permissions violation
исходный код здесь