Изменить указатель стека пользователя в режиме ядра - PullRequest
0 голосов
/ 06 сентября 2018

Я пишу символьное устройство, которое принимает в качестве входных данных с 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.106, и она выполняется в Virtual Box.

...