繁体   English   中英

setjmp / longjmp问题

[英]Problem with setjmp/longjmp

下面的代码不起作用。 谁能指出为什么

#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指向包含指向已分配堆栈的POINTER的单元格

然后,一些观察:

1)setjmp不适用于此目的:此代码仅在某些系统上可能有效,并且可能仅在som运行时库版本中有效。

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

据我所知,您正在实现某种“纤维”。 如果您使用的是Win32,则有一组功能可以安全地实现此功能(请参阅“光纤”)。 在Linux上,我建议您看看“ libfiber”。

问候

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM