使堆栈指针返回到mmap返回的指针. (Linux,32位VM)
我正在尝试将我的堆栈指针移动到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))==MAP_FAILED){ perror("mmap failed"); } initctx->regs[4]=newsp; restorectx(initctx,0); 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,*/ 该程序在程序集的最后一行失败. 对于malloc,我知道我可能需要向指针添加0x000f0000,但是mmap呢?或者我们如何使堆栈调整到mmapp-ed位置. 解决方法
Linux(或一般的UN * X)已经具有执行这种上下文替换的功能:
> 如果使用它们,可以通过设置合适的ucontext_t / struct sigcontext(ucontext_t的uc_mcontext成员)替换整个初始寄存器集(包括stackpointer).调用setcontext()然后变得类似于扩展的longjmp(). 可以在Wikipedia article on 有关ucontext_t的Linux定义,请参阅: > ucontext_t:Linux sourcecode, (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |