Linux kernel 在警报处理程序关闭之前,当警报确实关闭时,保存环境的最佳方法是什么?

Linux kernel 在警报处理程序关闭之前,当警报确实关闭时,保存环境的最佳方法是什么?,linux-kernel,Linux Kernel,我试图在2.4Linux内核上实现用户线程(家庭作业),上下文切换的技巧似乎是使用一个每隔x毫秒发出一次的警报,并将我们发送到一个警报处理程序,我们可以从该处理程序将jmp延长到下一个线程。我现在面临的困难是,如何拯救环境,以便日后重返家园 基本上,我有一个jmp_buff数组,每次使用报警的“上下文切换”发生时,我都希望将前一个上下文保存到数组的相应条目中,并将longjmp保存到下一个条目中。然而,事实上,我需要从事件处理程序执行此操作,这意味着仅在事件处理程序中使用setjmp无法提供我想

我试图在2.4Linux内核上实现用户线程(家庭作业),上下文切换的技巧似乎是使用一个每隔x毫秒发出一次的警报,并将我们发送到一个警报处理程序,我们可以从该处理程序将jmp延长到下一个线程。我现在面临的困难是,如何拯救环境,以便日后重返家园

基本上,我有一个jmp_buff数组,每次使用报警的“上下文切换”发生时,我都希望将前一个上下文保存到数组的相应条目中,并将longjmp保存到下一个条目中。然而,事实上,我需要从事件处理程序执行此操作,这意味着仅在事件处理程序中使用setjmp无法提供我想要的环境类型(就涉及堆栈和程序计数器而言),因为堆栈中包含事件处理程序调用,而pc位于事件处理程序中

我想我可以查看堆栈并修改它以满足我的需要,但这感觉有点麻烦。我的另一个想法是在跳转到事件处理程序之前以某种方式将环境作为参数传递给事件处理程序,但我不知道这是否可行


所以我想我的问题是-我怎么做才对

你应该能够做如下事情:

if (setjmp(&from_thread))
    return;
else
    longjmp(&dest_thread, 1);
在事件处理程序中。当然,这意味着它将返回到事件处理程序中的线程中-但这没关系,因为您将
直接返回它,因此它将返回到事件处理程序触发时线程所在的位置

(当然,这假定您已经为线程设置了单独的堆栈)