我正在读一本关于 Windows Internals 的书,但有一些我不明白的地方:
“内核可以作为硬件中断处理的一部分来处理软件中断,或者在线程调用与软件中断相关的内核函数时同步处理。”
那么这是否意味着软件中断或异常只会在以下条件下被处理:
a. 当内核正在执行与软件异常(陷阱)相关的线程函数时 b. 当它已经在处理硬件陷阱时
我的理解正确吗?
下一步:
“在大多数情况下,内核会安装前端陷阱处理函数,这些函数在将控制权转移到处理陷阱的其他函数之前和之后执行一般陷阱处理任务。”
我不太明白‘前端陷阱处理函数’和‘处理陷阱’是什么意思?
谁能帮我?
答案1
这听起来像是家庭作业,但我会尝试一下。
在我看来,这听起来像是在说软件中断(可能与异常不同!)在不确定的时间。基本上,操作系统希望提高效率,并可能将它们作为另一个中断(似乎是硬件)的一部分或在您进入内核空间时(例如,发出内核请求)处理。
至于前端陷阱处理,这或多或少意味着内核在处理每个陷阱之前和之后都会得到一次机会。例如,无论您多么努力,有些陷阱都无法传递给用户代码。内核只会处理它,而不会让用户代码接触它。其他的可能很简单,比如设置一个不同的堆栈来处理中断,然后让用户代码尝试一下。如果没有任何用户级代码处理它,那么它最终将采取一些默认操作。
答案2
对我来说,这似乎是在说,软件中断要么 A)在内核代码中与硬件中断处理相同的部分,要么 B)内核在软件中断发生时不执行任何操作,但会记住中断已发生,并且当调用与软件中断相关的函数时,将处理该中断。
Windows 有一种称为“延迟过程调用”(DPC) 的功能,其中大部分中断处理被延迟到方便的时间。之所以这样做,是因为 x86 CPU 只有一条 IRQ 线路,该线路由外部 PIC 或 APIC 多路复用。当触发 IRQ 时,CPU 会自动禁用 IRQ,直到中断服务例程重新启用它们。但由于只有一条 IRQ 线路,这意味着当 IRQ 被禁用时,所有 IRQ 都被禁用。x86 架构有许多使用 IRQ 的设备,因此这实际上意味着系统(或至少是该特定 CPU)在 IRQ 被禁用期间处于被挟持状态。因此,DPC 机制的存在是为了确保 IRQ 在必要的最短时间内被关闭。理想的情况是 ISR 在重新启用 IRQ 之前进行绝对最少的处理,并将其余工作转移到 DPC。
我可能错了,但我认为软件中断也会自动禁用 IRQ。因此,即使软件中断没有 I/O 服务,它仍然会导致系统/单个 CPU 无法服务其他中断,直到中断处理程序重新启用它们。
使用汇编语言 INT 指令的系统调用是软件中断(除非 Windows 现在使用不同的方法,例如 Linux 使用 linux-gate.so 技巧),以及 CPU 异常,包括页面错误、除以零,
因此,我认为,Windows 和任何操作系统中的所有中断都是异步处理的,原因如上所述。我不是内核专家,所以仅将上述内容视为一些见解。