LKM: зависание системы при использовании insmod - PullRequest
0 голосов
/ 25 марта 2020

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

исходный код здесь

...