Сделайте указатель стека на указатель, возвращаемый mmap. (Linux, 32-разрядная виртуальная машина)

Я пытаюсь переместить указатель стека в область 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)

5
задан Edison 13 May 2011 в 08:07
поделиться