511 时钟硬件

大部分PC机中有两个时钟源,他们分别叫做RTCOS(操作系统)时钟。RTCReal Time Clock,实时时钟)也叫做CMOS时钟,它是PC主机板上的一块芯片(或者叫做时钟电路),它靠电池供电,即使系统断电,也可以维持日期和时间。由于它独立于操作系统,所以也被称为硬件时钟,它为整个计算机提供一个计时标准,是最原始底层的时钟数据。

 

Linux只用RTC来获得时间和日期;然而,通过作用于/dev/rtc设备文件,也允许进程对RTC编程。内核通过0x700x71 I/O端口存取RTC。通过执行/sbin/clock系统程序(它直接作用于这两个I/O端口),系统管理员可以配置时钟。

 

OS时钟产生于PC主板上的定时/计数芯片,由操作系统控制这个芯片的工作,OS时钟的基本单位就是该芯片的计数周期。在开机时操作系统取得RTC中的时间数据来初始化OS时钟,然后通过计数芯片的向下计数形成了OS时钟,所以OS时钟并不是本质意义上的时钟,它更应该被称为一个计数器。OS时钟只在开机时才有效,而且完全由操作系统控制,所以也被称为软时钟或系统时钟。下面我们重点描述OS时钟的产生。

 

OS时钟所用的定时/计数芯片最典型的是8253/8254可编程定时/计数芯片,其硬件结构及工作原理在这里不详细讲述,只简单地描述它是怎样维持OS时钟的。OS时钟的物理产生示意图如图5.1 所示:


       5.1  8253/8254工作示意图

可编程定时/计数器总体上由两部分组成:计数硬件和通信寄存器。通信寄存器包含有控制寄存器、状态寄存器、计数初始值寄存器(16位)、计数输出寄存器等。通信寄存器在计数硬件和操作系统之间建立联系,用于二者之间的通信,操作系统通过这些寄存器控制计数硬件的工作方式、读取计数硬件的当前状态和计数值等信息。在Linux内核初始化时,内核写入控制字和计数初值,这样计数硬件就会按照一定的计数方式对晶振产生的输入脉冲信号(5~100MHz的频率)进行计数操作:计数器从计数初值开始,每收到一次脉冲信号,计数器减1,当计数器减至0时,就会输出高点平或低电平,然后,如果计数为循环方式(通常为循环计数方式),则重新从计数初值进行计数,从而产生如图所示的输出脉冲信号(当然不一定是很规整的方波)。这个输出脉冲是OS时钟的硬件基础,之所以这么说,是因为这个输出脉冲将接到中断控制器上 ,产生中断信号,触发后面要讲的时钟中断,由时钟中断服务程序维持OS时钟的正常工作,所谓维持,其实就是简单的加1及细微的修正操作。这就是OS时钟产生的来源。