gpt4 book ai didi

c - 使堆栈指针指向 mmap 返回的指针。 (Linux,32 位虚拟机)

转载 作者:IT王子 更新时间:2023-10-29 01:20:11 25 4
gpt4 key购买 nike

我试图将我的堆栈指针移动到一个 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 编译)

最佳答案

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

如果你使用它们,你可以通过设置一个合适的ucontext_t/struct sigcontext(uc_mcontext ucontext_t 的成员)。然后调用 setcontext() 就变成了一种扩展的 longjmp()

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

对于 ucontext_t 的 Linux 定义,请参见:

关于c - 使堆栈指针指向 mmap 返回的指针。 (Linux,32 位虚拟机),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5988784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com