Итак, я пытаюсь добавить syscall в свою Linux из модуля ядра. Вот код модуля.Как добавить системный вызов из модуля ядра?
asmlinkage int my_syscall() {
printk(KERN_INFO "AWESOME!\n");
return 0;
}
int load() {
unsigned long ** addr;
unsigned long int i = START;
printk(KERN_INFO "IN\n");
while (i < END) {
addr = (unsigned long **)i;
if (addr[__NR_close] == (unsigned long *)sys_close) {
break;
}
i += sizeof(void *);
}
if (i != END) {
addr += __NR_vserver;
struct page * p = virt_to_page(addr);
unsigned long paddr = (unsigned long)page_address(p);
set_memory_rw(paddr, 15);
*addr = &my_syscall;
set_memory_ro(paddr, 15);
}
return 0;
}
void unload() {
printk(KERN_INFO "OUT\n");
}
module_init(load);
module_exit(unload);
Так что я смотрю на sys_call_table
и однажды я нашел его, я пытаюсь переопределить не реализованный системный вызов (vserver
). Когда я insmod
получившийся .ko
, вот что dmesg
говорит:
BUG: unable to handle kernel paging request at ffffffff81801bc0
0xffffffff81801bc0
фактически адрес, где я tryng писать &my_syscall
. Я не знаю точно, что я делаю неправильно, но я думаю, что страница памяти все еще может быть в режиме ro
, когда я пытаюсь написать ...
Это не о добавлении системного вызова * из модуля *. – duskwuff