从本质上讲,问题是在中断处理程序中是否可以获得有效的“当前”(当前进程任务结构的地址),如果是,则可以相应地修改那里的内容以使其进入“睡眠”状态,可以是如果状态以某种方式发生变化,稍后由调度程序返回。答案可能取决于硬件。
但在 ARM 中,这是不可能的,因为“当前”与中断模式下的处理无关。请看下面的代码:
#linux/arch/arm/include/asm/thread_info.h
94 static inline struct thread_info *current_thread_info(void)
95 {
96 register unsigned long sp asm ("sp");
97 return (struct thread_info *)(sp & ~(THREAD_SIZE - 1));
98 }
USER模式下的sp和SVC模式下的sp是“相同的”(这里的“相同”并不是说它们相等,而是用户模式的sp指向用户空间栈,而svc模式的sp r13_svc指向内核栈,用户进程的task_structure在上一次任务切换时更新,当系统调用发生时,进程再次进入内核空间,当sp(sp_svc)仍然没有改变时,这2个sp是相互关联的,从这个意义上说,它们是相同的'),所以在 SVC 模式下,内核代码可以获得有效的 'current'。但在其他特权模式下,比如中断模式,sp 是“不同的”,指向 cpu_init() 中定义的专用地址。在这些模式下计算的“电流”将与被中断的进程无关,访问它会导致意外的行为。那'