系统调用是否真的像硬件中断一样“中断”CPU?

rb6*_*612 12 kernel interrupt

我试图更深入地了解系统调用和硬件中断是如何实现的,而让我感到困惑的是它们在处理方式方面的不同之处。例如,我知道启动系统调用(至少曾经)的一种方式是通过 x86INT 0x80指令。

  1. 处理器的处理方式是否与硬件外设中断 CPU 的方式完全相同?如果不是,它们在哪一点上不同?我的理解是它们都索引 IDT,只是向量中的索引不同。

  2. 在同样的意义上,我的理解是有一个softirq处理“下半部分”处理的想法,但我只看到这种形式的“软件中断”是指被物理硬件中断排队运行。系统调用“软件中断”是否也会触发softirqs 进行处理?这个术语也让我有点困惑,因为我看到人们将系统调用称为“软件中断”,但也softirq称为“软件中断”。

fer*_*anm 4

INT 0x80h是调用内核服务(系统函数)的旧方法。目前,syscalls用于调用这些服务,因为它们比调用中断更快。您可以在内核的中断描述符表idt.c和irq_vectors.h文件的第 50 行中检查此映射。

我认为回答您问题的重要一点是最后一个文件的标头,您可以在其中看到中断请求 (IRQ) 的组织方式。

 This is the general layout of the IDT entries: 
   Vectors   0 ...  31 : system traps and exceptions - hardcoded events
   Vectors  32 ... 127 : device interrupts
   Vector  128         : legacy int80 syscall interface
   Vectors 129 ... INVALIDATE_TLB_VECTOR_START-1 except 204 : device interrupts
   Vectors INVALIDATE_TLB_VECTOR_START ... 255 : special interrupts
Run Code Online (Sandbox Code Playgroud)

无论是通过电气方式还是软件方式,这并不重要。每当触发中断时,内核都会在 IDT 中查找其 ID 并运行(在内核模式下)关联的中断处理程序。由于它们必须非常快,因此它们通常会设置一些信息稍后由 asoftirq或 a处理tasklet。阅读《Unreliable Guide To Hacking The Linux Kernel》的第 2 章(快速阅读...)

我也建议您阅读 stackoverflow 上关于Intel x86 vs x64 系统调用问题的这个非常好的和彻底的答案,其中INT 0x80h,sysenter和syscall被放在上下文中......

我编写了自己的(非常谦虚且仍在建设中)有关中断和信号的自学页面,以帮助我理解信号和陷阱与中断的关系(例如 SIGFPE - 除以零)。