一、RTC
RTC为实时时钟,独立于CPU与所有其他芯片,依靠一个独立的小电池供电给RTC中的振荡器,即使关闭PC电源,还会继续运转。在RQ8上发出周期性的中断,可以对其编程实现一个闹钟。但Linux本身只使用RTC获得时间和日期。
墙上时间,在系统启动过程中根据实时钟(RTC)芯片保存数据进行初始化,在系统运行期间由系统时钟维护并在合适的时刻和RTC芯片进行同步。墙上时间存储于系统核心变量xtime中该变量记录了现实世界中的年月日格式的时间。更新函数update_wall_time()。
二、时间戳计数器TSC
现在CPU中引入TSC寄存器,TSC是一个64位的、用作时间戳计数器的寄存器 。它在每个时钟信号(CLK)到来时+1 。rdtsc指令用于读该寄存器 ,注意使用这个寄存器时,内核必须考虑时钟信号的频率,TSC能获得更精确的值。Linux在系统初始化的时候必须通过tsc_calibrate获得CLK的频率。tsc_calibrate根据在一个可编程间隔定时器给出的时间间隔内(约5ms)所发生的TSC计数的个数进行计算 。
相对时间:记录从系统启动直到当前时刻的系统时钟产生的滴答数,存储于系统核心变量jiffies(jiffies_64)
三、可编程间隔定时器PIT
通过IRQ0发出时钟中断 每若干毫秒(100Hz为10ms)产生一次时钟中断,即一个tick。
- 宏定义HZ。 宏定义Hz记录了不同体系结构下,系统时钟所要求的可编程定时器产生中断的频率。
- 宏定义CLOCK_TICK_RATE。 宏定义CLOCK_TICK_RATE记录了不同体系结构下,驱动可编程定时器工作的输入时钟频率。
- 宏定义LATCH。 宏定义LATCH记录了上述两个宏定义的比值,用于在内核初始化过程中设置可编程定时器中计数器寄存器counter的初始值。