使堆栈指针返回到mmap返回的指针. (Linux,32位VM)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使堆栈指针返回到mmap返回的指针. (Linux,32位VM),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1322字,纯文字阅读大概需要2分钟。
内容图文
![使堆栈指针返回到mmap返回的指针. (Linux,32位VM)](/upload/InfoBanner/zyjiaocheng/971/04bbe7e5ba5d4c65af84b43317474307.jpg)
我正在尝试将我的堆栈指针移动到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);
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)已经具有执行这种上下文替换的功能:
如果使用它们,可以通过设置合适的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,……都有它们自己的,这就是包含堆栈指针的寄存器集).
内容总结
以上是互联网集市为您收集整理的使堆栈指针返回到mmap返回的指针. (Linux,32位VM)全部内容,希望文章能够帮你解决使堆栈指针返回到mmap返回的指针. (Linux,32位VM)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。