【发布时间】:2011-08-24 17:33:26
【问题描述】:
我试图将堆栈指针移动到 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,在 ubuntu 上使用 GCC 编译)
【问题讨论】:
标签: c linux pointers assembly stack