使堆栈指针返回到mmap返回的指针.(Linux,32位VM)

Edi*_*son 5 c linux assembly stack pointers

我正在尝试将我的堆栈指针移动到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);
Run Code Online (Sandbox Code Playgroud)

86:

 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,*/
Run Code Online (Sandbox Code Playgroud)

该程序在程序集的最后一行失败.

对于malloc,我知道我可能需要向指针添加0x000f0000,但是mmap呢?或者我们如何使堆栈调整到mmapp-ed位置.(mmap的手册页:http://linux.die.net/man/3/mmap,在ubuntu上用GCC编译)

Edi*_*son 2

所以问题实际上是 mmap 在堆栈的相反方向增长(遗憾的是,我忘记了)。因此,要分配指针,我只需分配 (mmapped_stack+stack_size) 而不仅仅是指针。