ARM中的Linux进程上下文和SVC调用

根据一些Linux书籍

服务由用户应用程序发出的系统调用的内核代码代表相应的应用程序进程运行,并被称为在进程上下文中执行。 中断处理程序在中断上下文中运行。

现在svc和irq是两个例外。

所以当linux正在处理svc时,它在进程上下文中,而在处理irq的时候,它在中断上下文中。 这是如何映射的?

只是一个编辑

在书籍中也提到,当工作队列在进程上下文中运行时,tasklets / softirqs在中断上下文中运行。 那么这是否意味着tasklet将在CPSR.mode = IRQ中运行?

如果我以正确的方式理解你的困惑:

由于Linux是一个功能强大的,先发制人的,复杂的操作系统,与裸机硬件相比,它能更好地处理诸如处理中断或服务软件陷阱等概念。

例如,当一个supervisor调用(svc)发生硬件切换到SVC模式时,Linux处理这个过程很简单,就像准备一些数据结构来进一步处理它,然后退出SVC模式一样,核心可以在用户模式下继续服务,从而可以运行更多的异常模式,而不是阻止它们。

IRQ模式是一样的,Linux在IRQ模式下处理最低限度。 它准备IRQ发生的数据结构,应该调用哪个处理程序等,然后立即从IRQ模式退出,以允许更多的核心发生。 稍后,其他内部内核线程可能会进一步处理该中断。 由于硬件相对简单,运行速度非常快,因此中断处理与多进程并行运行。

这种高级方法的缺点是它不能保证响应时间的要求,或者在较慢的硬件如MCU上看到开销。

所以ARM的异常模式为Linux提供了两件事情:消息类型和优先级,硬件支持。

  • 如果是SVC,IRQ,FIQ,DATA ABORT,UNDEFINED INSTRUCTION等,消息类型就是异常模式的内容。所以当硬件进入异常模式时,Linux隐式知道它正在处理什么。
  • 优先级是提供一个有能力和响应的硬件,例如系统应该能够在处理一些不那么重要的管理员呼叫时确认中断。
  • 硬件支持是为了更容易和更快地处理上述两个。 例如,一些寄存器被存储,或者有一个额外的系统模式来处理重入IRQ更容易。