0

関数ポインターとバッファーポインターを 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 で実行されます。

4

0 に答える 0