加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-14 01:03:19 所属栏目:Linux 来源:网络整理
导读:我正在尝试将我的堆栈指针移动到mmap-ed区域来模拟上下文切换,但不知何故,下面的代码总是会产生分段错误: C: struct savectx { void *regs[JB_SIZE];};struct savectx* initctx=(struct savectx*)malloc(sizeof(savectx));void *newsp;if ((newsp=mmap(0,S
我正在尝试将我的堆栈指针移动到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位置.
(mmap的手册页:http://linux.die.net/man/3/mmap,在ubuntu上用GCC编译)

解决方法

Linux(或一般的UN * X)已经具有执行这种上下文替换的功能:

> setcontext()
> makecontext()

如果使用它们,可以通过设置合适的ucontext_t / struct sigcontext(ucontext_t的uc_mcontext成员)替换整个初始寄存器集(包括stackpointer).调用setcontext()然后变得类似于扩展的longjmp().

可以在Wikipedia article on setcontext().中找到用法示例

有关ucontext_t的Linux定义,请参阅:

> ucontext_t:Linux sourcecode,
> struct sigcontext:Linux sourcecode,x86 architecture definition,(这是依赖于体系结构的 – 所以x86,ARM,PPC,MIPS,……都有它们自己的,这就是包含堆栈指针的寄存器集).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读