系统调用是否完整地在软件中断处理程序内执行?

Che*_*han 5 kernel interrupt system-calls

系统调用是否完全在软件中断处理程序的上下文中执行?

我的意思是,某些系统调用(例如 read())可能需要很长时间才能返回,这违背了 ISR 的执行时间应该非常短的策略。系统调用是否被卸载到其他线程?这是如何运作的?

[引用任何内核都可以]

Ben*_*oit 3

系统调用在ISR内的大多数内核上运行。快速浏览一下 Linux 的早期版本,您会注意到int $Ox80调用内核。从内核开发的角度来看,这个解决方案可能是最简单的,但它有一个很大的缺点:只要运行 ISR;中断被禁用。禁用中断时间太长很糟糕,因为很明显你的系统不会做出反应(它会延迟外部事件,它不会按时重新安排,......)。

正如阿德尔在他的回答中解释的那样,抢占是一个明智的解决方案。但是,每当内核由于资源不可用而选择抢占线程时,它通常已经花费了大量时间来禁用中断。

系统调用是否被卸载到其他线程?

你说得对。中断线程和/或线程内核是一个更智能的解决方案。Solaris 和 Mac OS X 等内核更喜欢使用非常简单的 ISR,仅唤醒高优先级中断线程。因此,ISR 被减少到最少的处理,并且系统在禁用中断的情况下运行的时间也大大减少。由于这些中断线程具有高优先级,因此它们很可能在 ISR 返回时运行。好处是中断将再次启用,因此更高优先级的工作不会被延迟。对于线程内核,例如最近发布的 Linux,可以在内核内部完成多种操作,并且尽管有一个进程阻塞,其他进程仍然能够进入内核。

希望这有帮助!