関数ポインターとバッファーポインターを ioctl で入力として受け取る char デバイスを作成しています。
ユーザー マシン コンテキストを変更して、ユーザー モードに戻ると、その関数がそのバッファー ポインターが指す新しいスタックで実行されるようにしたいと考えています。
私がやったことは次のとおりです。
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.106 で、Virtual Box で実行されます。