操作系统如何处理很少的中断并保持进程继续进行?

how does the operating system treat few interrupts and keep processes going?

我正在学习计算机组织和结构(我正在使用 Linux OS 和 x86-64 架构)。我们研究过,当在用户模式下发生中断时,OS 会收到通知,它会通过从 TSS 加载内核 rsp 来在用户堆栈和内核堆栈之间切换,然后保存必要的寄存器(例如rip),如果出现软件中断,它还会保存错误代码。最后,就在跳转到适当的处理程序之前,它会将 TF 归零,如果发生硬件中断,它也会将 IF 归零。我想问几件事:

  1. 错误代码保存在rip中,为什么要同时加载?

  2. 如果我考虑这样一种情况,很少有中断同时发生导致 IF 和 TF 打开,如果我将 TF 和 IF 归零,但我一次只处理一个中断,是不是'我不处理所有其他中断吗?一般来说,OS在使用IDT的方法时,如何处理同时发生的几个中断,每个中断都有特定的向量? 发生这种情况是因为每个程序都有自己的虚拟内存,因此所有程序的中断处理过程都是无关的吗?我在哪里可以阅读更多相关信息?

  3. 操作系统如何在处理中断的同时保持其他必要的进程运行?

非常感谢您的时间和关注!

  1. the error code is save in the rip, so why loading both?

您对错误代码有一些误解。具体来说:

  • 它不是由软件中断产生的(例如像int 0x80这样的指令)
  • 它是由某些异常(页面错误、一般保护错误、双重错误等)产生的。
  • 错误代码(如果使用)不保存在 RIP 中,它被压入堆栈以便异常处理程序可以使用它来获取有关异常原因的更多信息

2a. if I consider a case where few interrupts happen together which causes the IF and TF to turn on, if I zero the TF and IF, but I treat only one interrupt at a time, aren't I leave all the other interrupts untreated?

当 IF 标志清零时,可屏蔽 IRQ(不包括其他类型的中断 - 软件中断、异常)被推迟(未禁用),直到 IF 标志再次设置。他们 "temporarily untreated" 直到他们以后得到治疗。

TF 标志仅对调试有用(例如单步调试,您希望 CPU 在执行每条指令后生成陷阱)。它仅在进程(在 user-space 中)被调试时被清除,这样您就不会不小心继续调试内核本身;但是大多数进程并没有像这样调试,所以大多数时候 TF 标志已经清除(并且在它已经清除时清除它并没有真正做任何事情)。

2b. in general, how does the OS treat few interrupts that occur at the same time when using the method of IDT with specific vector for each interrupt? does this happen because each program has it's own virtual memory and thus the interruption handling processes of all the programs are unrelated? where can i read more about it?

确定一个中断何时可以中断(包括它何时可以中断另一个中断)有复杂的规则。这些规则大多只适用于 IRQ(不是内核永远不会使用自己的软件中断,也不是一旦发生就采取的异常)。理解规则意味着理解 IF 标志和中断控制器(例如中断向量和本地 APIC 中的 "task priority register" 如何影响本地 APIC 中的 "processor priority register",它决定了哪些组的 IRQ 将被推迟IF 标志被设置)。关于这个的信息可以从 Intel 的手册中获得,但是 Linux 如何使用它只能从 Linux 源代码 and/or Linux 特定文档中获得。

除此之外还有 "whatever mechanisms and practices the OS felt like adding on top"(例如延迟过程调用、tasklet、softIRQ、额外的堆栈管理)增加了更多的复杂性(也只能从 Linux 源代码 and/or Linux 具体文档)。

注意:我不是 Linux 内核开发人员,因此 t/won 无法提供查找 Linux 特定文档的位置的链接。

  1. how does an operating system keep other necessary progresses running while handling the interrupt?

单个 CPU 不能同时 运行 2 段不同的代码(例如中断处理程序和用户 -space 代码)。相反,它 运行 一次一个地发送它们(例如 运行s user-space 代码,然后在很短的时间内切换到 IRQ 处理程序,然后 returns 到用户-space 代码)。因为 IRQ 处理程序仅 运行s 持续很短的时间,所以它会产生一切都在同时发生的错觉(即使它不是)。

当然当你有多个CPU时,不同的CPUs can/do 运行同时有不同的代码片段。