我正在编写一个char设备,该设备将ioctl作为输入使用一个函数指针和一个缓冲区指针。
我想修改用户机器上下文,以便在用户模式下,使用该缓冲区指针指向的新堆栈执行该功能。
我所做的是:
long ioctl_funcs(struct file *filp,unsigned int cmd, unsigned long arg)
{
int ret = 0;
switch(cmd) {
case IOCTL_SET_FUN:
printk(KERN_INFO "start\n");
struct myarg* a;
a = (struct myarg*) arg;
struct pt_regs* regs = task_pt_regs(current);
regs->ip = a->func;// func is a function implemented in user space
regs->sp = a->stack;// stack is the buffer allocated in user space with malloc
break;
}
return ret;
}
好消息是该功能已激活,坏消息是堆栈是相同的(我已经使用gdb对其进行了测试)。
特别是即使:regs->sp = 0;
也会由于没有堆栈而在新函数崩溃时执行。
看来以这种方式分配堆栈指针是无效的。
为什么?我应该如何正确分配堆栈指针?
Linux内核版本为:3.18.16,在Virtual Box上执行。