gpt4 book ai didi

c - setjmp/longjmp 的问题

转载 作者:太空宇宙 更新时间:2023-11-04 09:57:03 27 4
gpt4 key购买 nike

下面的代码无法正常工作。谁能指出原因

#define STACK_SIZE 1524

static void mt_allocate_stack(struct thread_struct *mythrd)

{

unsigned int sp = 0;
void *stck;

stck = (void *)malloc(STACK_SIZE);

sp = (unsigned int)&((stck));
sp = sp + STACK_SIZE;
while((sp % 8) != 0)
sp--;

#ifdef linux

(mythrd->saved_state[0]).__jmpbuf[JB_BP] = (int)sp;
(mythrd->saved_state[0]).__jmpbuf[JB_SP] = (int)sp-500;
#endif

}

void mt_sched()

{

fprintf(stdout,"\n Inside the mt_sched");
fflush(stdout);

if ( current_thread->state == NEW )
{
if ( setjmp(current_thread->saved_state) == 0 )
{
mt_allocate_stack(current_thread);

fprintf(stdout,"\n Jumping to thread = %u",current_thread->thread_id);
fflush(stdout);
longjmp(current_thread->saved_state, 2);
}
else
{
new_fns();
}
}
}

我要做的就是在新堆栈上运行 new_fns()。但是在 new_fns() 处显示段错误。

谁能指出我哪里出了问题。

最佳答案

除了所有其他考虑因素,您正在使用“&stck”而不是“stck”作为堆栈! &stck 指向包含指向已分配堆栈的指针的单元格

然后,一些观察:

1) setjmp 并非用于此目的:此代码可能仅适用于某些系统,并且可能仅适用于某些运行时库版本。

2) 我认为应该用其他方式来评估 BP。我建议检查你是如何编译组成堆栈框架的。即,在 x86 平台上,EBP 指向本地上下文的基址,而在 *EBP 处,您可以找到调用上下文的基址。 ESP 指向 EBP-SIZE_OF_LOCAL_CONTEXT,不同的编译器通常以不同的方式计算该大小。

据我所知,您正在实现某种“纤维”。如果您在 Win32 上工作,则有一组函数可以安全地实现此功能(请参阅“fibers”)。在 Linux 上,我建议您查看“libfiber”。

问候

关于c - setjmp/longjmp 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2454289/

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