Linux时钟系统
硬件时钟
大部分PC机中有两个时钟源,它们分别叫做RTC和OS(操作系统)的时钟。RTC也叫做CMOS时钟,它是PC主机板上的一块芯片,用于保存硬件信息,日期、时间、CPU类型、内存大小、PC配置中的并行、串行端口等重要信息,它靠电池供电,即使系统断电,也可以维持日期和时间。也被叫做硬件时钟。内核通过0x70和0x71 I/O端口存取RTC。
可编程间隔定时器 PIT
每个PC机中都有一个PIT,以通过IRQ0产生周期性的时钟中断信号,作为系统定时器 system timer。当前使用最普遍的是Intel 8254 PIT芯片,它的I/O端口地址是0x40~0x43。
Intel 8254 PIT有3个计时通道,每个通道都有其不同的用途:
(1) 通道0用来负责更新系统时钟。每当一个时钟滴答过去时,它就会通过IRQ0向 系统 产生一次时钟中断。
(2) 通道1通常用于控制DMAC对RAM的刷新。
(3) 通道2被连接到PC机的扬声器,以产生方波信号。
每个通道都有一个向下减小的计数器,8254 PIT的输入时钟信号的频率是1.193181MHZ,也即一秒钟输入1193181个clock-cycle。每输入一个clock-cycle其时间 通道的计数器就向下减1,一直减到0值。因此对于通道0而言,当他的计数器减到0时,PIT就向系统产生一次时钟中断,表示一个时钟滴答已经过去了。计数 器为16bit,因此所能表示的最大值是65536,一秒内发生的滴答数是:1193181/65536=18.206482.
时间戳计数器 TSC
从Pentium开始,所有的Intel 80x86 CPU就都包含一个64位的时间戳记数器(TSC)的寄存器。该寄存器实际上是一个不断增加的计数器,它在CPU的每个时钟信号到来时加1(也即每一个clock-cycle输入CPU时,该计数器的值就加1)。
汇编指令rdtsc可以用于读取TSC的值。利用CPU的TSC,操作系统通常可以得到更为精准的时间度量。假如clock-cycle的频率是400MHZ,那么TSC就将每2.5纳秒增加一次。
几个概念
(1)时钟周期(clock cycle)的频率:8253/8254 PIT的本质就是对由晶体振荡器产生的时钟周期进行计数,晶体振荡器在1秒时间内产生的时钟脉冲个数就是时钟周期的频率。
Linux用宏 CLOCK_TICK_RATE来表示8254 PIT的输入时钟脉冲的频率(在PC机中这个值通常是1193180HZ),该宏定义在include/asm-i386/timex.h头文件中
define CLOCK_TICK_RATE 1193180 kernel=2.4 &2.6
(2)时钟滴答(clock tick):当PIT通道0的计数器减到0值时,它就在IRQ0上产生一次时钟中断,也即一次时钟滴答。PIT通道0的计数器的初始值决定了要过多少时钟周期才产生一次时钟中断,因此也就决定了一次时钟滴答的时间间隔长度。
(3)时钟滴答的频率(HZ):1秒时间内PIT所产生的时钟滴答次数。 这个值也由PIT通道0的计数器初值决定的.Linux内核用宏HZ来表示时钟滴答的频率,而且在不同的平台上HZ有不同的定义值。对于ALPHA和 IA62平台HZ的值是1024,对于SPARC、MIPS、ARM和i386等平台HZ的值都是100。该宏在i386平台上的定义如下 (include/asm-i386/param.h):
define HZ 100 kernel=2.4
define HZ CONFIG_HZ kernel=2.6
(4)宏LATCH:定义要写到PIT通道0的计数器中的值,它表示PIT将隔多少个时钟周期产生一次时钟中断。公式计算:
LATCH=(1秒之内的时钟周期个数)÷(1秒之内的时钟中断次数)=(CLOCK_TICK_RATE)÷(HZ)
定义在
define LATCH ((CLOCK_TICK_RATE + HZ/2) / HZ)
(5)全局变量jiffies:用于记录系统自启动以来产生的滴答总数。启动时,kernel将该变量初始为0,每次时钟中断处理程序timer_interrupt()将该变量加1。因为一秒钟内增加的时钟中断次数等于Hz,所以jiffies一秒内增加的值也是Hz。由此可得系统运行时间是jiffies/Hz 秒。
jiffies定义于中:
extern unsigned long volatile jiffies;
Note:在kernel 2.4,jiffies是32位无符号数;kernel 2.6,jiffies是64位无符号数。
OS时钟
OS 时钟产生于 PC 主板上的定时/计数芯片,由操作系统控制这个芯片的工作,OS 时钟
的基本单位就是该芯片的计数周期。在开机时操作系统取得 RTC 中的时间数据来初始化 OS
时钟,然后通过计数芯片的向下计数形成了 OS 时钟,所以 OS 时钟并不是本质意义上的时钟,
它更应该被称为一个计数器。OS 时钟只在开机时才有效,而且完全由操作系统控制,所以也
被称为软时钟或系统时钟。
OS 时钟产生于 PC 主板上的定时/计数芯片,由操作系统控制这个芯片的工作,OS 时钟
的基本单位就是该芯片的计数周期。在开机时操作系统取得 RTC 中的时间数据来初始化 OS
时钟,然后通过计数芯片的向下计数形成了 OS 时钟,所以 OS 时钟并不是本质意义上的时钟,
它更应该被称为一个计数器。OS 时钟只在开机时才有效,而且完全由操作系统控制,所以也
被称为软时钟或系统时钟。下面我们重点描述 OS 时钟的产生。
OS 时钟所用的定时/计数芯片最典型的是 8253/8254 可编程定时/计数芯片,其硬件结构
及工作原理在这里不详细讲述。
时钟周期和时钟频率
就工作方式而言,CPU 分两种:同步 CPU 和异步 CPU。异步 CPU并不常见,用途广泛的是同步 CPU 。
既然是同步 CPU,当然就需要有一个同步机制,或者说要有个“主管”来维护同步状态,不然你做一样,我做一样,没有统一协调,那不就乱套了?在计算机中,就是时钟发生器来完成这项工作——不停给芯片发送一个连续的脉冲信号,每一次脉冲到来,芯片内的晶体管就改变一次状态,让整个芯片完成一定任务。统一指挥,完成任务。
电脑中有许许多多的半导体芯片,这些芯片就是在时钟发生器发送的特定时钟频率下有条不紊进行工作的。
一秒(1 s)内,震荡周期的个数称为时钟频率,俗称主频。
不难看出主频和时钟周期的关系:
时 钟 频 率 ( 主 频 ) = 1 / CPU时钟周期
由上面的关系不难推出,主频越高,CPU的运算速度就越快。
每一款芯片都有自己的频率极限。因为电脑中的芯片绝大多数属于数字逻辑芯片,数字芯片中众多的晶体管全都工作在开关状态,它们的导通和关断动作无不是按照时钟信号的节奏进行的。如果时钟频率过高,就可能出现晶体管的状态来不及变化的情况,产生死锁或随机性误操作。
有的 CPU 芯片允许在短时间内提升时钟频率,即俗称的“超频”,以获得更好的性能。当然,如果长时间处于超频状态,将可能对芯片造成 irreparable 损伤。
注意!主频越高,CPU的运算速度就越快。但主频不等于处理器一秒钟执行的指令条数,因为一条指令的执行可能需要多个时钟周期。