以下代码无效。 任何人都可以指出为什么
#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()中显示分段错误。
任何人都可以指出我的错误。
答案 0 :(得分:2)
除了所有其他考虑因素,你使用“& stck”代替ok“stck”作为堆栈! & stck指向包含指定堆栈的POINTER的单元格
然后,一些观察结果:
1)setjmp并非用于此目的:此代码可能仅适用于某些系统,并且可能仅适用于som运行时库版本。
2)我认为BP应该以其他方式进行评估。我建议你检查一下编译堆栈框架的方式。即,在x86平台上,EBP指向本地上下文的基础,在* EBP,您可以找到调用上下文的基础地址。 ESP指向EBP-SIZE_OF_LOCAL_CONTEXT,不同的编译器通常以不同的方式计算该大小。
据我所知,你正在实施某种“纤维”。如果您正在使用Win32,那么有一组功能可以安全地实现此功能(请参阅“光纤”)。在linux上,我建议你看看“libfiber”。
此致