内核时间子系统的配置

内核中的时间子系统主要向上层提供两种功能,一个就是时间功能,另一个就是timer定时器功能。

时间功能:
时间功能是由内核中的timekeeper模块来负责维护,该模块需要clocksource的支持。内核中的模块划分为如下:
Timekeeper—>clocksource—>hardware

定时器功能:
从原理上说,定时器需要有一个定期到来的tick来驱动它运行,每个tick到来时检查一下定时器是否到时,由此来实现定时器的功能。所以定时器的实现可以分为tick device设备和基于tick device的上层timer定时器实现。在内核中的模块划分如下所示:
timer—>tick device—>clockevent—>hardware

基于tick device的timer定时器还分为两种类型,一种是低精度timer,一种是高精度timer。
低精度timer是旧的内核中的实现,一直延续至今,也就是我们熟悉的基于jiffies系统滴答来实现的,旧的内核中只有这种定时器实现。
高精度timer是为了满足新的需求而诞生的hrtimer。高精度基本可以满足任何情况下的需求了,但是由于历史原因低精度timer不能直接从内核中删除,必须保持兼容性。
一个CPU内可能有多个local clock硬件,但是只会有一个被设置为该CPU的tick设备,每个CPU有且只有一个tick设备。

内核配置

1、通用clock source和clock event的内核配置

(1)clock event是为tick设备提供支持的模块,它分为了新版和旧版两种架构。新架构采用的是通用模型,旧架构采用的是平台相关的实现。
相关的配置项为:CONFIG_GENERIC_CLOCKEVENTS和CONFIG_GENERIC_CLOCKEVENTS_BUILD。
如果配置了这两个选项,就会使用新的时间子系统的构架,如果不配置,将使用旧的时间子系统架构。 这一项的配置一般是在arch中选择的。比如arch/arm/Kconfig中,而其余的需要根据情况在menuconfig中配置,对应的Kconfig为kernel/kernel/time/Kconfig。

arch/arm/Kconfig
config ARCH_OMAP1
    bool "TI OMAP1"
    depends on MMU
    select ARCH_HAS_CPUFREQ
    select ARCH_HAS_HOLES_MEMORYMODEL
    select ARCH_OMAP
    select ARCH_REQUIRE_GPIOLIB
    select CLKDEV_LOOKUP
    select CLKSRC_MMIO
    select GENERIC_CLOCKEVENTS---选择通用时间框架
    select GENERIC_IRQ_CHIP
    select HAVE_CLK
    select HAVE_IDE
    select IRQ_DOMAIN
    select NEED_MACH_IO_H if PCCARD
    select NEED_MACH_MEMORY_H
    help
      Support for older TI OMAP1 (omap7xx, omap15xx or omap16xx)

如上所示,定义ARCH_OMAP1的时候就已经select GENERIC_CLOCKEVENTS作为时间子系统的框架。

(2)clocksource是为timekeeper提供支持的模块,目前的内核都是使用新的通用框架。不过为了兼容性考虑,kernel也保留了CONFIG_ARCH_USES_GETTIMEOFFSET这个配置项.

2、tick device的配置

如果选择了新的时间子系统的软件架构(配置了CONFIG_GENERIC_CLOCKEVENTS),那么内核会打开Timers subsystem的配置选项,主要是和tick以及高精度timer配置相关。

tick相关的配置:

CONFIG_HZ_PERIODIC

无论何时,都启用周期性的tick,即便是在系统idle的时候。

CONFIG_NO_HZ_IDLE

Idle dynticks system (tickless idle)。在系统idle的时候,停掉tick。使能该选项会自动使能CONFIG_NO_HZ_COMMON选项。

CONFIG_NO_HZ_FULL

Full dynticks system (tickless)。即便在非idle的状态下,也就是说cpu上还运行在task时,也可能会停掉tick,这个选项和实时应用相关。使能该选项会自动使能CONFIG_NO_HZ_COMMON选项。

上面的三个选项只能是配置其一,上面描述的是新的内核配置方法。对于旧的内核,只有CONFIG_NO_HZ一个配置项,用来配置idle dynticks system(非idle时有周期性tick,idle时无周期性tick),为了兼容旧的系统,新的内核仍然支持了这个选项。

除此之外还有一个用来配置tick模式的选项:

CONFIG_TICK_ONESHOT

如果配置了这个选项,就决定了系统中所有的tick设备都是oneshot mode,否则就是periodic mode。
当配置了CONFIG_NO_HZ_COMMON或者CONFIG_HIGH_RES_TIMERS的时候,这个选项就会一起被配置上,也就是说采用了dynticks或者hrtimer的系统中,它的tick设备模式必须是oneshot类型的。

3、timer模块的配置

CONFIG_HIGH_RES_TIMERS

和高精度timer相关的配置只有一个的配置项。如果配置了高精度hrtimer,那么就会自动配置上CONFIG_TICK_ONESHOT,表示系统只支持one-shot类型的tick device。

4、 time配置示例

选择一个时间子系统的构架:
(1)新的通用时间子系统软件框架(配置了CONFIG_GENERIC_CLOCKEVENTS)
(2)传统时间子系统软件框架(不配置CONFIG_GENERIC_CLOCKEVENTS,配置CONFIG_ARCH_USES_GETTIMEOFFSET)
除非维护一个旧的系统,否则建议用新的通用时间子系统框架了,这时候可能的配置包括如下几种情况:
(1)使用低精度timer和不停的tick(HZ_PERIODIC)
这种是旧的处理方式
(2)使用低精度timer和dynamic tick(CONFIG_NO_HZ_IDLE)
(3)使用高精度timer和不停的tick(HZ_PERIODIC)
(4)使用高精度timer和dynamic tick(CONFIG_NO_HZ_IDLE)
这种是时下较流行的配置
注:上面描述的dynamic tick指的是Idle dynticks system。我们不考虑Full dynticks system的情况。
采用了dynticks或者hrtimer的系统中,它的tick设备模式必须是oneshot类型的,也就是说上面4种情况,只有第1种情况下的tick 是周期模式的,其他三种都是oneshot mode。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值