Linux时钟系统

注:本文资料全部来源于网络或书籍,同时加上个人理解。若有侵权,告知即删。若有错误,留言商讨。

实时时钟(RTC):

X86体系结构下,RTC实时时钟在系统断电的时候使用备用电池继续运行,RTC能在IRQ8上周期的发出中断,频率在2~8291HZ之间,linux只是用RTC在启动的时候来获取时间和日期。不过也可以使用/dev/rtc来对RTC设备编程修改其值。

时间戳计数器(TSC):

Pentium开始,X86处理器包含一个计数器,可以对CLK上的时钟信号进行计数,64位时间戳计数器。该计数器的时间精度通常比可编程间隔定时器精度高。Linux内核在系统初始化的时候确定该时钟信号(CLK)的频率,内核中并不申明和定义这个频率,而是使用内核启动后通过一个函数测量5ms内产生的信号数量。

因为 TSC 随着处理器周期速率的变化而变化,所以它提供了非常高的精确度。它经常被用来分析和检测代码。TSC 的值可以通过 rdtsc 指令来读取。TSC 的节拍还可以转换为秒,转换方法是将其除以 CPU 的时钟速率(可以从内核变量 cpu_khz 获取)。

可编程间隔定时器(PIT):

PIT以固定的时钟频率发出中断,叫做时钟中断。【X86:该中断的中断号IRQ0】。时钟中断的时间间隔叫做一个节拍

HZ:时钟中断的频率,ARM:100or200(Exynos4412)   X86:1000

CLOCK_TICK_RATE:时钟周期,【arm/mach-xxx/include/mach/timex.h】。【Exynos4412:CLOCK_TICK_RATE=12000000】

 

linux内核已经实现好了时钟中断对应的服务程序,这个服务程序也称之为时钟中断服务函数;硬件定时器周期性的给CPU产生时钟中断,那么对应的中断服务程序就会被内核周期性的调用。

时钟中断服务函数做如下内容:

  1. 更新系统的运行时间,更新jiffies_64(jiffies)
  2. 更新实际时间,计算当前系统负载
  3. 检查进程的时间片是否用完,决定是否需要重新调度新进程
  4. 检查是否有超时的软件定时器,如果有处理这个超时的软件定时器
     

 

Linux计时体系结构:

jiffies变量:记录系统启动以来的节拍数。一个32位的变量。

jiffies_64变量:jiffies通过连接器被换算成一个jiffies_64位计数器的低32位。jiffies对应着jiffies_64的低32位。当修改jiffies_64的时候jiffies也跟着改。访问jiffies_64的时候需要同步机制,分为两个32位数访问。

x_time变量:存放当前时间和日期,time_spec类型的数据结构。

单处理器系统上的计时体系结构

 

 

你可能感兴趣的:(Linux内核)