【发布时间】:2013-09-25 17:35:10
【问题描述】:
好的,我正在尝试从内核模块向我的 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 模式...
【问题讨论】:
标签: c linux kernel system-calls