我正在尝试在2.4 Linux内核(家庭作业)上实现用户线程,并且上下文切换的技巧似乎是使用每x毫秒关闭的警报并将我们发送到警报处理程序,我们可以从下一个主题。我遇到的困难是弄清楚如何保存环境以便以后返回。
基本上我有一个jmp_buffs数组,每次使用警报发生“上下文切换”时,我想将前一个上下文保存到数组的相应条目,将longjmp保存到下一个。但是,事实上我需要从事件处理程序执行此操作意味着只在事件处理程序中使用setjmp将不会给我我想要的那种环境(就堆栈和程序计数器而言)因为堆栈在其中调用事件处理程序,并且pc在事件处理程序中。
我想我可以看看堆栈并改变它以满足我的需求,但这感觉有点麻烦。我的另一个想法是在跳转到事件处理程序之前以某种方式传递环境作为事件处理程序的参数,但我无法弄清楚这是否可行。
所以我猜我的问题是 - 我该怎么做?
答案 0 :(得分:1)
你应该能够做类似的事情:
if (setjmp(&from_thread))
return;
else
longjmp(&dest_thread, 1);
在事件处理程序中。当然,这意味着它将返回到事件处理程序中的线程中 - 但是没关系,因为那样你将return
直接从它出来,所以它会回到事件处理程序时线程所在的位置触发。
(当然这假设您已经为线程设置了单独的堆栈。)