首页 » 智能 » Linux时间子系统(下)_准时器_时钟

Linux时间子系统(下)_准时器_时钟

萌界大人物 2024-11-20 18:41:55 0

扫一扫用手机浏览

文章目录 [+]
小编
\"大众 data-from=\"大众0\"大众 data-is_biz_ban=\"大众0\公众>
序言:
上一篇文章我们大略理解了一些关于韶光的观点,以及Linux内核中的关于韶光的基本理解。

Linux时间子系统(下)_准时器_时钟 智能

而本篇则会大略解释时钟硬件,以及Linux韶光子系统干系的一些数据构造。
打算机里的时钟硬件
前文曾经提到过,内核韶光子系统的实现也须要有硬件的支持。
在打算机里一共有三类时钟硬件,分别是真时钟RTC(Real Time Clock)、定时器Timer、计时器Counter。
那生活中的场景举例,我们可以理解成RTC相称于是腕表、座钟,定时器相称于是闹钟,计时器当然便是运动会中的计时器。
把稳这是三类时钟硬件,而不是三个,某一类时钟可能有多个不同的硬件,某一个时钟硬件也可能实现多种不同的时钟类型。
打算机中还有其它的时钟类型,比如晶振时钟,是驱动CPU运行的周期旗子暗记,用来触发和同步CPU内部的操作,我们常说某CPU是多少GHz,便是说这个时钟晶振每秒向CPU发送多少旗子暗记。
晶振时钟一样平常在CPU内部,但有些嵌入式CPU的晶振在外部。
时钟晶振在软件层不可见。
还有一些设备也有自己的时钟,还有相应的驱动可以掌握它。
由于这些时钟都和韶光子系统关系不大,以是本文中就不谈论它们了。
再详细点的话,我们以x86平台上的时钟举例说说:
真时钟RTC,在x86上的硬件实现也叫做RTC,和CMOS(打算机中有很多叫做CMOS的东西,但是是不同的观点,此处的CMOS是指BIOS设置保存数据的地方),是放在一起的。
由于在关机后都须要供电,以是两者放在一起,由一个纽扣电池供电。
以是有时候也会被人叫做CMOS时钟。
定时器Timer,在UP时期是PIT(Programmable Interval Timer),它以固定时间间隔向CPU发送中断旗子暗记。
PIT可以在系统启动时设置每秒产生多少个定时器中断,一样平常设置是100,250,300,1000,这个值叫做HZ。
到了SMP时期,PIT就不适用了,此时有多种不同的定时器。
有一个叫做Local APIC Timer的定时器,它是和中断系统干系的。
中断系统有一个全局的IO APIC,有NR_CPU个Local APIC,一个Local APIC对应一个CPU。
以是在每个Local APIC都安装一个定时器,专门给自己对应的CPU发送定时器中断,就很方便。
还有一个定时器叫做HPET(High Precision Event Timer),它是Intel和微软共同研发的。
它不仅是个定时器,而且还有计时器的功能。
HPET反面特定的CPU绑定,以是它可以给任意一个CPU发中断,这点和Local APIC Timer不同。
计时器Counter,RTC或者定时器虽然也可以实现计时器的目的,但是由于精度太差,以是系统都有专门的计时器硬件。
计时器一样平常都是一个整数寄存器,以特定的韶光间隔增长,比如说1纳秒增加1,这样两次读它的值就可以算出个中的韶光差,而且精度很高。
x86上最常用的计时器叫做TSC(Time Stamp Counter),是个64位整数寄存器。
还有一个计时器叫做ACPI PMT(ACPI Power Management Timer),但是它是一个设备寄存器,须要通过IO端口来读取。
而TSC是CPU寄存器,可以直接读取,读取速率就非常快。
Linux韶光子系统的文件汇总
Linux kernel 韶光子系统的源文件位于linux/kernel/time/目录下,基本包含如下:
这里面也包含几个主要的数据构造,接下来会分开说说:
Clocksource: 时钟源
clock source又被叫做时钟源,如果它的频率是10MHZ,就代表它每秒增加10M次,每增长一次我们称cycle加一,而且两次增长的韶光间隔相同,通过这个性子,可以在两个韶光点读取clock souce,相减得到一个差值,这个差值 / 频率就可以得到两个韶光点的韶光间隔。
设cycles:两个韶光点的cycle差值,hz :每一纳秒的cycle值,time :两点之间的韶光差(ns为单位)
以是可得:time = cycles/ hz
可以看到,通过cycles和hz做除法,可以很轻松的得到两韶光点的详细韶光差,但是落到代码中,就没那么大略了。
内核中由于效率或者兼容性问题,禁用了浮点数运算,如果用整数除法那么精度会受到影响,速率也不高,以是内核中用了乘法和移位运算的办法来实现上述公式,虽然也有偏差,但运算速率很高。
内核打算韶光差的公式:time = (cycles mul) >> shift,打算mul和shift的过程如下:
下面详细阐明一下这个打算过程:
上述代码,part2 很好理解,便是根据 mul = (time << shift) / cycle,做打算,part1可能比较难明得,意义如下:
time = (cycles mul) >> shift,可以看到想要获取time,先要cycles mul,如果cycles mul溢出了,那打算结果就完备缺点了,以是要对mul的值做限定,担保任何 可能的cycle的值 和mul值相乘都不会溢出,这便是part1的浸染。
要达成不产生溢出的哀求,首先要明确可能的cycle的值的范围,cycle一样平常是两次中断之间的时钟源计数差值。
以是,求cycle值范围的问题,就转化成了,两次时钟中断的最长间隔。
目前两次时钟中断的最长间隔被假设成了10分钟。
为什么是10分钟?这因此下两个成分相互平衡做取舍的结果:
打算精度,从打算精度来看,mul的值肯定是越大越好,mul的值越大,得到的time值的精度也就越高,当然mul值越大,cycles的最大值就越小,这会影响到第二个成分\"大众能耗\"大众.
能耗角度,这个和低功耗干系,由于如果系统处于idle线程的状态,会通过wfi进入低功耗状态,此时如果有中断来临,会让cpu退出,以是如果两次timer中断间隔韶光太短,会增加功耗。
综上两点,内核选择 10分钟 这个值,作为两次韶光中断的韶光间隔最大值,该逻辑可以在init_time_arch()中表示。
timer_device:时钟设备(也叫clock_event_device)
clocksrouce和clock_event_device之间的关系如上图所示。
在arm平台(其他平台该当也是类似)的设计中,硬件定时器设备和时钟源设备是合营利用的,硬件定时器可以设置时钟源到达何值时会产生一个中断。
在smp系统中,为了减少处理器间的通信开销,基本上每个cpu都会具备一个属于自己确当地timer_device,独立地为该cpu供应时钟事宜做事,smp中的每个cpu基于本地timer_device,建立自己的高精度定时器。
timekeeping模块
所谓timekeeping,如字面意思,便是让韶光持续更新下去。
linux内核中掩护了有三种韶光观点:
Wall time 现实韶光。
MONOTONIC time: 递增韶光,从系统被启动时候开始打算,但不包含cpu低功耗状态的韶光。
Boot time: 递增的韶光,在monotonic韶光的根本上增加cpu的低功耗状态的韶光。
上面三种韶光通过 xtime变量打算,xtime会在系统启动的时候通过从rtc获取的值来初始化,之后通过每次时钟中断的时候,加上当前韶光和上次中断产生韶光的差值。
可能会有的疑问:为什么须要掩护xtime,每次须要获取韶光的时候读取rtc不就好了?但实在读取rtc也有缺点,比如:
读取rtc的效率不高,以是一样平常只在初始化的时候掩护一次。
rtc能供应的韶光精度一样平常很低,最多就到毫秒级别,自己通过clock_source掩护可以达到ns级别。
高精度定时器和低精度定时器:
传统的低精度定时器,是指让硬件定时器每隔固定时间(1ms或者10ms)产生一次中断,这种操作的默认语义便是许可产生ms级的延迟,这种时钟中断频率作为任务调度用场来说还可以接管,但是如果有更高精度需求的设备就完备无法知足了。
以是就涌现了高精度定时器这种形式,它和低精度定时器的最大差别点在于:低精度是被动的等待下一次固定间隔的时钟中断的到来,而高精度定时器则会主动去设置硬件定时器,让它在第几个cycle上产生中断,从而知足自己的需求。
很自然的可以推测出来,如果要实现高精度定时器,那么必须担保硬件定时器支持one-shot模式,也便是可以以变革的中断频率涌现。
同时为了知足 任务调度的需求和原来系统的对 周期性时钟中断的依赖,专门安排了一个hrtimer来按照(CONFIG_CPU_HZ)规定的频率来对硬件定时器进行设置,从而达到周期性产生时钟中断的效果。
相信通过两期的内容,可以帮助大家对打算机韶光子系统有一个大概的理解,同时更好的理解hrtimer和timekeeping事理。
显然关于Linux韶光子系统的内容,还有很多可以深入挖掘,在此篇幅有限,就不做过多赘述了,也希望同样对操作系统感兴趣的小伙伴与我们一起互换。
部分内容出自:
CSDN博主「wmzjzwlzs」的原创文章,原文链接:https://blog.csdn.net/wmzjzwlzs/article/details/131617402
以及蜗窝科技 http://www.wowotech.net/timer_subsystem/time-subsyste-architecture.html

相关文章