好的,所以我正在尝试从内核模块向我的 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
实际上是我要写的地址&my_syscall
。我不确切知道我做错了什么,但我认为ro
当我尝试写时内存页面可能仍处于模式...