![系统调用实际上是否像硬件中断一样“中断”CPU?](https://linux22.com/image/176627/%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8%E5%AE%9E%E9%99%85%E4%B8%8A%E6%98%AF%E5%90%A6%E5%83%8F%E7%A1%AC%E4%BB%B6%E4%B8%AD%E6%96%AD%E4%B8%80%E6%A0%B7%E2%80%9C%E4%B8%AD%E6%96%AD%E2%80%9DCPU%EF%BC%9F.png)
我试图更深入地了解系统调用和硬件中断的实现方式,但一直让我困惑的是它们在处理方式上有何不同。例如,我知道启动系统调用(至少过去)的一种方式是通过 x86INT 0x80
指令。
处理器处理这个问题的方式是否与硬件外设中断 CPU 的方式完全相同?如果不是,它们在什么点上有所不同?我的理解是它们都对 IDT 进行索引,只是向量中的索引不同。
在同样的意义上,我的理解是有一种
softirq
处理“下半部分”处理的想法,但我只看到这种形式的“软件中断”指的是通过物理硬件中断排队运行。系统调用“软件中断”也会触发softirq
s进行处理吗?这个术语也让我有点困惑,因为我看到人们将系统调用称为“软件中断”,但也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 0x80h
,sysenter
和syscall
放在上下文中......
我写了我自己的(非常谦虚并且仍在建设中)自学页面中断和信号帮助我理解信号和陷阱与中断的关系(例如 SIGFPE - 除以零)。