系统调用实际上是否像硬件中断一样“中断”CPU?

系统调用实际上是否像硬件中断一样“中断”CPU?

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

  1. 处理器处理这个问题的方式是否与硬件外设中断 CPU 的方式完全相同?如果不是,它们在什么点上有所不同?我的理解是它们都对 IDT 进行索引,只是向量中的索引不同。

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

答案1

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

我认为回答您问题的重要一点是最后一个文件的标头,您可以在其中看到中断请求 (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

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

我建议您也阅读 stackoverflow 上这篇非常好的、彻底的答案Intel x86 与 x64 系统调用问题,哪里INT 0x80hsysentersyscall放在上下文中......

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

相关内容