概述
内核中的时间子系统主要向上层提供两种功能,一个就是时间功能,另一个就是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。
最后
以上就是暴躁乌龟为你收集整理的内核时间子系统的配置的全部内容,希望文章能够帮你解决内核时间子系统的配置所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复