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