浅析Linux中的时间编程和实现原理(二)硬件和GLibC库的细节
|
TSC (Time Stamp Counter) CPU 执行指令需要一个外部振荡器产生时钟信号,从 CLK 管脚输入。x86 提供了一个 TSC 寄存器,该寄存器的值在每次收到一个时钟信号时加一。比如 CPU 的主频为 1GHZ,则每一秒时间内,TSC 寄存器的值将增加 1G 次,或者说每一个纳秒加一次。x86 还提供了 rtdsc 指令来读取该值,因此 TSC 也可以作为时钟设备。TSC 提供了比 RTC 更高精度的时间,即纳秒级的时间精度。 PIT (Programmable Interval Timer) PIT 是 Programmable Interval Timer 的缩写,该硬件设备能定时产生中断。早期的 PIT 设备是 8254,现在多数可以集成在 Intel 的 I/O Control Hub 电路中,可以通过端口 0x40~0x43 访问 PIT。系统利用 PIT 来产生周期性的时钟中断,时钟中断通过 8259A 的 IRQ0 向 CPU 报告。它的精度不高,其入口 clock 的频率为 1MHz,理论上能产生的最高时钟频率略小于 0.5MHz。实际系统往往使用 100 或者 1000Hz 的 PIT。 HPET (High Precision Event Timer) PIT 的精度较低,HPET 被设计来替代 PIT 提供高精度时钟中断(至少 10MHz)。它是由微软和 Intel 联合开发的。一个 HPET 包括了一个固定频率的数值增加的计数器以及 3 到 32 个独立的计时器,这每一个计时器有包涵了一个比较器和一个寄存器(保存一个数值,表示触发中断的时机)。每一个比较器都比较计数器中的数值和寄存器中的数值,当这两个数值相等时,将产生一个中断。 APIC Timer (Advanced Programmable Interrupt Controller Timer) APIC ("Advanced Programmable Interrupt Controller") 是早期 PIC 中断控制器的升级,主要用于多处理器系统,用来支持复杂的中断控制以及多 CPU 之间的中断传递。APIC Timer 集成在 APIC 芯片中,用来提供高精度的定时中断,中断频率至少可以达到总线频率。系统中的每个 CPU 上都有一个 APIC Timer,而 PIT 则是由系统中所有的 CPU 共享的。Per CPU 的 Timer 简化了系统设计,目前 APIC Timer 已经集成到了所有 Intel x86 处理器中。 以上这些硬件仅仅是 x86 体系结构下常见的时间相关硬件,其他的体系结构如 mips、arm 等还有它们常用的硬件。这么多的硬件令人眼花缭乱,但其实无论这些硬件多么复杂,Linux 内核只需要两种功能: 一是定时触发中断的功能; 另一个是维护和读取当前时间的能力。 一些硬件提供了中断功能,一些硬件提供了读取时间的功能,还有一些硬件则能够提供两种功能。下表对上面描述过的硬件进行了一个简单的总结:
也许您已经发现,这些硬件提供的功能非常简单,为了满足应用程序的各种各样的需求,Linux 内核和 C 标准库还需要做很多工作,才能让我们使用诸如 gettimeofday()、setitimer() 等函数进行时间相关的操作。 C 库函数的工作 我们在第一部分已经详细介绍了标准 C 库中关于时间函数的用法。表 2 罗列了一些主要的 API。
本文力图简短,无法对上表中的每一个 API 进行详细分析。幸运的是,我们只需要研究几个典型 API 的实现,便可以举一反三,了解其他 API 的大致实现思想。 (编辑:佛山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |



