linux时间子系统 - 总体框架

1. 定时器类型


经典定时器(低精度)

内核最初版本就是提供的此类定时器,实现于kernel/timer.c中,提供的典型分辨率为4ms,从现在看来分辨率很低,此类定时器只产生周期性的信号

高精度定时器

随着应用需求的提升,后来引入了高分辨率定时器,分辨率可以达到ns级别,这样就可以不用只产生周期行的信号,而是设置一些需要的事件信号就可以,这样就可以随机发出信号,而原先的周期信号就可以通过模拟来产生

2. 源代码


时间子系统的源代码在目录kernel/time下,代码总量近2W行:

~/kernel/time$ wc -l ./*
  1089 ./alarmtimer.c
   763 ./clockevents.c--------------------clockevent
  1019 ./clocksource.c--------------------clocksource
  1830 ./hrtimer.c------------------------hrtimer
   301 ./itimer.c
   136 ./jiffies.c
   197 ./Kconfig
    14 ./Makefile
  1017 ./ntp.c
    13 ./ntp_internal.h
   446 ./posix-clock.c
  1523 ./posix-cpu-timers.c
  1131 ./posix-timers.c
   303 ./sched_clock.c
   168 ./test_udelay.c
  1005 ./tick-broadcast.c
   110 ./tick-broadcast-hrtimer.c
   535 ./tick-common.c
   166 ./tick-internal.h
   132 ./tick-oneshot.c
  1183 ./tick-sched.c
    84 ./tick-sched.h
   764 ./time.c
   109 ./timeconst.bc
   127 ./timeconv.c
   112 ./timecounter.c
  2054 ./timekeeping.c
    74 ./timekeeping_debug.c
    26 ./timekeeping.h
    29 ./timekeeping_internal.h
  1718 ./timer.c
   401 ./timer_list.c
   425 ./timer_stats.c
 19004 total

3. 子系统软件框架


时间子系统的软件框架如图所示,从底层硬件到上层软件的整个关系概略如下:

这里写图片描述

3.1 clockevent和clocksource(timekeeper)

一个硬件timer在内核中可以被表示成两种形式:clockevent和clocksource

clocksource层主要是来表示硬件源,提供操作硬件设备的各种功能:读取时间;timer设备的休眠与唤醒;使能和关闭设备等。clocksource最终会提供给timekeeper模块使用,每注册进一个timer设备,系统都会进行比较,让timekeeper选取一个最合适的clocksource

clockevent层表示时钟事件,当某个事件到时间时,就产生一个中断报告事件到来,clockevent被上层的tick_device层使用。

3.2 tick_device

tick_device表示能产生tick的设备,其实就是timer设备,或许是出于区分,所以用tick_device来表示。

tickdevice分两种:oneshot和periodic。oneshot是单触发的,在内核中又称为是动态的,它产生的时钟信号都是动态信号,没有固定的周期,不过也可以模拟固定周期,只要以一个固定时间产生时钟信号即可。periodic是周期的,它以一个固定的时间来产生时钟信号,而且支持这种模式的底层硬件timer一般是低精度的。

对于低精度timer,最合适的是表示成periodic tick_device,这样就能产生周期性的事件,但是如果要支持动态(即高精度)事件,可以通过配置CONFIG_NO_HZ_COMMON开启,这样就能实现在低精度timer设备的支持下实现动态事件,但是动态事件的产生不能是高精度的。

对于高精度timer,最合适的就是表示成oneshot tick_device,这样就能实现动态事件,如果要模拟周期性的事件,还需要开启CONFIG_HIGH_RES_TIMERS,这样就能实现。

3.3 hrtimer

时间子系统中动态事件的运转需要hrtimer模块支持,每一个事件用hrtimer表示,然后加入到红黑树中,然后在每个hrtimer的时间到期时,timer就会产生时钟信号,然后调用此时的事件任务就可以了。

change log


datecontentlinux
2017.1.2初稿linux4.6.3
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值