一切尽在标题中。欢迎任何指向良好文档的链接。
4 回答
本地定时器中断是在 APIC 上实现的定时器,它只中断特定的 CPU,而不是引发任何 CPU 都可以处理的中断。Bovet & Cesati 的“Understanding the Linux Kernel”中对此进行了讨论。一个片段:
最近出现在 80x86 微处理器中的本地 APIC(参见第 4 章中的“中断和异常”部分)提供了另一种时间测量设备:CPU 本地定时器。
CPU本地定时器是一种类似于刚才描述的可编程间隔定时器的设备,可以发出一次性或周期性中断。但是,有一些区别:
- APIC 的定时器计数器为 32 位长,而 PIT 的定时器计数器为 16 位长;因此,可以对本地定时器进行编程,使其以非常低的频率发出中断(计数器存储在发出中断之前必须经过的滴答数)。
- 本地 APIC 定时器仅向其处理器发送中断,而 PIT 引发全局中断,可由系统中的任何 CPU 处理。
- APIC 的定时器基于总线时钟信号(或 APIC 总线信号,在旧机器中)。它可以被编程为每 1、2、4、8、16、32、64 或 128 个总线时钟信号减少定时器计数器。相反,使用自己的时钟信号的 PIT 可以以更灵活的方式进行编程。
一个比迈克尔·伯尔(Michael Burr)更少技术性的答案:
有些事情需要随时完成,不管在哪个 CPU 上。
其他事情需要在每个 CPU 上随时完成。例如,检查我们是否需要切换到另一个进程。
第二种类型的本地定时器中断存在 - 每当它执行时,我们都会检查它们并执行所需的操作。
在 SMP 系统上,apic 计时器用于调度程序/重新调度线程。
在 UP 系统上,pit timer 用于调度程序/重新调度线程。
通常,PIT 不再在 SMP 系统中使用。
我觉得本地计时器用于处理 IPI 相关功能。我的猜测可能是错误的,不需要查看关于它们的配置和处理程序包含什么的代码。但我觉得系统计时器和 jiffies 与其中一个 GP 计时器相关联,因此在 SMP ARM 中,来自该计时器的中断通过 GIC 关联注册与单个内核相关联。将在本地计时器上获得更多机智。