加入收藏 | 设为首页 | 会员中心 | 我要投稿 佛山站长网 (https://www.0757zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

浅析Linux中的时间编程和实现原理(二)硬件和GLibC库的细节

发布时间:2016-10-31 01:41:20 所属栏目:Linux 来源:网络整理
导读:引子 熟悉了基本的编程方法之后,我们的兴趣就在于,计算机如何实现这一切的呢?在那些应用层 API 和底层系统硬件之间,操作系统和库函数究竟做了些什么? 首先

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中的时间编程和实现原理(二)硬件和GLibC库的细节

也许您已经发现,这些硬件提供的功能非常简单,为了满足应用程序的各种各样的需求,Linux 内核和 C 标准库还需要做很多工作,才能让我们使用诸如 gettimeofday()、setitimer() 等函数进行时间相关的操作。

C 库函数的工作

我们在第一部分已经详细介绍了标准 C 库中关于时间函数的用法。表 2 罗列了一些主要的 API。

浅析Linux中的时间编程和实现原理(二)硬件和GLibC库的细节

本文力图简短,无法对上表中的每一个 API 进行详细分析。幸运的是,我们只需要研究几个典型 API 的实现,便可以举一反三,了解其他 API 的大致实现思想。

(编辑:佛山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读