实时时钟RTC基本上所有的PC都包含实时时钟独立于CPU与所有其他芯片依靠一个独立的小电池供电给RTC中的振荡器即使关闭PC电源,还会继续运转与CMOSRAM往往集成在一个芯片内例如:Motorala146818能在IRQ8上发出周期性的中断,频率在2HZ~8192之间可以对其编程实现一个闹钟Linux Operating Systems Analysisxlanchen@2007.10.9H
xlanchen@2007.10.9 Linux Operating Systems Analysis 6 实时时钟RTC ⚫ 基本上所有的PC都包含实时时钟 ⚫ 独立于CPU与所有其他芯片 ⚫ 依靠一个独立的小电池供电给RTC中的振荡器 ⚫ 即使关闭PC电源,还会继续运转 ⚫ 与CMOS RAM往往集成在一个芯片内 ⚫ 例如:Motorala 146818 ⚫ 能在IRQ8上发出周期性的中断,频率在 2HZ~8192之间 ⚫ 可以对其编程实现一个闹钟
Linux本身只使用RTC获得时间和日期对应的设备文件为/dev/rtc可以通过设备文件对其编程内核通过0x70和0x71两个端口访问RTC系统管理员可以通过执行时钟程序设置时钟xlanchen@2007.10.9LinuxOperatingSystemsAnalysis
xlanchen@2007.10.9 Linux Operating Systems Analysis 7 ⚫ Linux本身只使用RTC获得时间和日期 ⚫ 对应的设备文件为/dev/rtc ⚫ 可以通过设备文件对其编程 ⚫ 内核通过0x70和0x71两个端口访问RTC ⚫ 系统管理员可以通过执行时钟程序设置时钟
时间戳计数器TSC在80x86微处理器中,有一个CLK输入引线接收外部振荡器的时钟信号从pentium开始,很多80x86微处理器都引入了一个TSC一个64位的、用作时间戳计数器的寄存器它在每个时钟信号(CLK)到来时+1例如时钟频率400MHz的微处理器,TSC每2.5ns就+1rdtsc指令用于读该寄存器Linux Operating Systems Analysisxlanchen@2007.10.9R
xlanchen@2007.10.9 Linux Operating Systems Analysis 8 时间戳计数器TSC ⚫ 在80x86微处理器中,有一个CLK输入引线 ⚫ 接收外部振荡器的时钟信号 ⚫ 从pentium开始,很多80x86微处理器都引入 了一个TSC ⚫ 一个64位的、用作时间戳计数器的寄存器 ⚫ 它在每个时钟信号(CLK)到来时+1 ⚫ 例如时钟频率400MHz的微处理器,TSC每2.5ns就+1 ⚫ rdtsc指令用于读该寄存器
与后面介绍的可编程间隔定时器相比,TSC可以获得更精确的时钟,为此,Linux在系统初始化的时候必须确定时钟信号CLK的频率(即CPU的实际频率)calibrate tsc根据在一个相对较长的时间间隔内(约50ms)所发生的TSC计数的个数进行计算那个间隔由可编程间隔定时器给出由于只在系统初始化的时候运行一次,因此本程序可以执行较长时间,而不会引起问题xlanchen@2007.10.9Linux Operating Systems Analysis9
xlanchen@2007.10.9 Linux Operating Systems Analysis 9 ⚫ 与后面介绍的可编程间隔定时器相比,TSC可 以获得更精确的时钟 ⚫ 为此,Linux在系统初始化的时候必须确定时钟信 号CLK的频率(即CPU的实际频率) ⚫ calibrate_tsc ⚫ 根据在一个相对较长的时间间隔内(约50ms)所发生 的TSC计数的个数进行计算 ⚫ 那个间隔由可编程间隔定时器给出 ⚫ 由于只在系统初始化的时候运行一次,因此本程序可以 执行较长时间,而不会引起问题
可编程间隔定时器PIT经过适当编程后,可以周期性的给出时钟中断通常是8254CMOS芯片使用/O端口0x40~0x43Linux将PIT编程为:100Hz通过IRQO发出时钟中断每10ms产生一次时钟中断,即一个tick10xlanchen@2007.10.9LinuxOperatingSystemsAnalysis
xlanchen@2007.10.9 Linux Operating Systems Analysis 10 可编程间隔定时器PIT ⚫ 经过适当编程后,可以周期性的给出时钟中断 ⚫ 通常是8254 CMOS芯片 ⚫ 使用I/O端口0x40~0x43 ⚫ Linux将PIT编程为: ⚫ 100Hz ⚫ 通过IRQ0发出时钟中断 ⚫ 每10ms产生一次时钟中断,即一个tick