2010-05-16 50 views
0

我试图在2.4 Linux内核(作业)上实现用户线程,上下文切换的窍门似乎是使用每隔x毫秒关闭一次的报警,并将我们发送到一个报警处理程序,从中我们可以将longjmp下一个线程。我遇到的困难是如何保存环境以便稍后返回。当警报消失时警报处理程序关闭之前保存环境的最佳方法是什么?

基本上我有一个jmp_buffs数组,每次使用警报发生“上下文切换”时,我都希望将前一个上下文保存到数组的相应条目中,并将longjmp保存到下一个上下文中。然而,事实上,我需要从事件处理程序执行此操作,这意味着在事件处理程序中使用setjmp不会给我完全所需的环境类型(只要涉及到堆栈和程序计数器),因为堆栈有事件处理程序调用它并且pc在事件处理程序中。

我想我可以看看堆栈并改变它以适应我的需要,但是这感觉有点麻烦。另一个想法是在跳转到事件处理程序之前以某种方式传递环境作为事件处理程序的参数,但我无法弄清楚这是否可行。

所以我想我的问题是 - 我该如何做到这一点?

回答

1

你应该能够只是像做:

if (setjmp(&from_thread)) 
    return; 
else 
    longjmp(&dest_thread, 1); 

在事件处理程序。当然,这意味着它会重新回到事件处理程序的线程中 - 但这没关系,因为那样你就会直接从return开始,所以当事件处理程序触发时它会返回到线程所在的位置。

(当然这假设你已经为线程设置了单独的堆栈)。