Я пытаюсь переместить указатель стека в область mmap-ed, чтобы имитировать переключение контекста, но каким-то образом приведенный ниже код всегда выдает ошибку сегментации:
C:
struct savectx {
void *regs[JB_SIZE];
};
struct savectx* initctx=(struct savectx*)malloc(sizeof(savectx));
void *newsp;
if ((newsp=mmap(0,STACK_SIZE,PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS,0,0))==MAP_FAILED){
perror("mmap failed");
}
initctx->regs[4]=newsp;
restorectx(initctx,0);
x86:
restorectx:
movl 4(%esp),%ecx /*Move jump buffer addr to ecx */
movl 8(%esp),%eax /*Longjmp return value */
movl (JB_SP*4)(%ecx),%esp /*JB_SP is defined to be 4,*/
Программа не работает на последней строке сборки.
Что касается malloc, я знаю, что мне, возможно, придется добавить к указателю 0x000f0000, но как насчет mmap? Или как сделать так, чтобы стек соответствовал положению mmapp-ed. (страница руководства для mmap: http://linux.die.net/man/3/mmap , скомпилирована с помощью GCC на ubuntu)