【linux内核分析与应用-陈莉君】时钟中断机制

目录

 

1.linux中的时钟中断

2.基本的时钟硬件

3.更多与时钟中断相关的硬件

4.基本时钟运行机制

5.linux中的时间系统

6.linux时钟框架

7.高精度定时器实现机制

8.定时器的使用,执行与应用

9.总结与参考资料与问题


1.linux中的时钟中断

时钟中断是非常重要的一个中断,因为操作系统的活动都受到它的激励,系统利用时钟中断
维持系统事件,促使进程的切换,以保证所有进程共享CPU,利用时钟中断进行记障,监督系统
工作以及确定未来的调度优先级等工作,可以说时钟中断是整个操作系统的脉搏.

2.基本的时钟硬件

linux的OS时钟的物理产生原因是可编程定时计数器产生的输出脉冲,这个脉冲送入CPU以后,
就可以引发一个中断请求信号,我们将它称作时钟中断,时钟中断的周期也就是脉冲信号的
周期,我们将其称作滴答或者节拍.

从本质上来说时钟中断只是一个周期性的信号,完全是硬件的行为.
该信号触发的CPU执行一个中断服务程序,这时最简单的时钟硬件,在目前的系统中,
还有更多相关的时钟硬件.

【linux内核分析与应用-陈莉君】时钟中断机制_第1张图片

3.更多与时钟中断相关的硬件

与时钟有关的硬件:
(1)实时时钟RTC(Real Time Clock),它是用于长时间地存放系统的时间设备,即使
   关机以后也可以依靠主板的cmouse来维持系统的计时;
(2)可编程间隔器PIT(Programmable Interval Timer),该设备可以周期性地发生
   时钟中断信号,在linux系统中该中断时间间隔由HZ表示,这个事件间隔就被称
   作一个节拍,也就是tick;
(3)时间戳计数器TSC(Time Stamp Clock),CPU附带了一个64位的时间戳
   寄存器,当时钟信号到达的时候,该寄存器的内容就会自动加一;
(4)高精度计时器HPET,这是由intel开发的一种新型定时器芯片,该设备有一组计时器,
   每个计时器对应有自己的时钟信号,时钟信号到来的时候就会自动加一;
(5)CPU本地定时器,在处理器本地IPRC中提供了一个定时设备,可以单次或者周期性地
   产生中断信号;
(6)高进度定时器hrtimer,这个定时器是目前最常用的,它提供纳秒级别的定时精度,
   满足对精确时间有迫切需求的应用程序或者内核驱动,如多媒体运用,音频设备的
   驱动程序等.

在这六个相关的硬件中有两个定时器,每个都有特定的功能.

【linux内核分析与应用-陈莉君】时钟中断机制_第2张图片

4.基本时钟运行机制

从图中可以看出,一般来说,RTC是OS时钟的时间基准.
操作系统通过读取RTC来初始化OS时钟,在此之后二者就保持同步运行,
共同维护着系统的时间.
所谓同步是指操作系统在运行的过程中每隔一个固定的时间就会刷新
或者校正RTC中的信息.


linux中的基本时钟运作机制如图所示:
OS时钟和RTC时钟要通过BIOS的连接是因为传统PC机的BIOS中固化有对RTC进行有关操作
的函数,通常操作系统也直接利用这些函数对RTC进行操作,例如从RTC中读取有关数据对
OS中进行初始化,对RTC进行更新等等.
Linux在内核初始化完成以后就完全地抛弃了BIOS中的程序,我们看到RTC处于最底层,
提供最原始的时钟数据,OS时钟建立在RTC之上,初始化完成后将完全由操作系统控制,
和RTC就脱离了关系,操作系统通过OS时钟提供给应用程序所有与实践有关的服务.
因为OS时钟完全是一个软件的问题.其所能表达的时间由操作系统的设计者决定.
将OS时间时钟定义成整型还是长整型或者更大的超乎想象的数据都是由操作系统的设定
者来决定的.

【linux内核分析与应用-陈莉君】时钟中断机制_第3张图片

5.linux中的时间系统

linux的时间基准是1970年1月1日凌晨0点,OS时钟记录的时间就是系统事件,
系统时间以时钟节拍为单位,什么是时钟节拍呢?时钟节拍表示发生一次中断
的时间,比如说1ms.
linux中使用全局变量jiffies表示启动以来的时钟节拍数,比如系统启动了
n秒,那么jiffies的值就是n*HZ;
实际时间存放在内核的xtime变量中,系统启动时,内核通过读取RTC来初始化
实际时间.

【linux内核分析与应用-陈莉君】时钟中断机制_第4张图片

6.linux时钟框架

linux的时钟框架相当复杂,在此给出简述.
如果你输入一个date命令,那么内核中哪个部件获取时间的呢?
图中告诉大家是通过时钟源clocksource.
从硬件层来说它其实就是固定时钟频率驱动的计数器,所谓计数器就是简单单调的加一操作,
直到溢出为止.
对于我们真实的用户来说,我们感知的是真实世界的真实时间.也就是所谓的墙上的时间,
clocksource只能给出按给定频率??(补清)递增的周期技术,如果将其与墙上的时间相关联,
就是timekeeper.

clock_event_device的作用:
实现普通定时器与高精度定时器;
同时也用于产生节拍tap事件供给进程调度系统使用,
在软件架构上来看,时钟事件设备被分为两层,与硬件相关的
被妨碍machine层,与硬件无关的通用代码被集中到通用时间框架层.
这个符合内容对软件设计需求,平台的开发者只需要实现平台相关的接口即可,
不需要关注复杂的上层的时间框架.

tick_device是基于时钟时间的设备的进一步封装,用于代替原有的时钟dida中断,
给内核提供节拍事件,以完成进程的调度或进程信息的统计,负载平衡或时间更新等操作.

【linux内核分析与应用-陈莉君】时钟中断机制_第5张图片

7.高精度定时器实现机制

高精度定时器代码实现的时候,内核的开发者考查了多种数据结构,
比如说基数树,哈希表等,最后选择了内核中常用的红黑树.

hrtimer不停地被创建和销毁,新的hrtimer按顺序被插入到红黑树
中,树的最左边的节点就是最快到期的时间,在每个CPU中都有一个
hrtimer_cpu_base结构,这个结构管理着三种不同的时间基准系统
的hrtimer,分别是:
realtime--实时时间
boottime--启动时间
monotontic--单调时间;
每一种时间基准系统通过它的字段指向它各自的红黑树,关于具体
的代码可查看源代码.

【linux内核分析与应用-陈莉君】时钟中断机制_第6张图片

8.定时器的使用,执行与应用

定时器是管理内核所花时间的基础,也被称为动态定时器或者内核定时器.

定时器的使用步骤:
1.进行一些初始化的工作;
2.设置一个到期的时间;
3.指定到期后要执行的函数;
4.激活定时器.

定时器相关接口与定义:
1.定义一个定时器struct time_list my_timer;
2.初始化init_timer;
3.激活定时器add_timer;
4.修改定时器mod_timer;
5.删除定时器del_timer.

定时器的在内核中是struct time_list,如图.



定时器的执行时机:
内核在发生时钟中断之后就开始
执行时钟定时器了,定时器作为
软中断是在下半部分被run_timer_softirq()来执行的.


定时器的应用举例:
首先设置进程的状态为不可中断的睡眠;
然后编写内核定时器来实现进程的延时,对定时器的各个字段赋初值,
然后通过激活函数激活定时器,然后调用调度函数schedule让该进程挂起,
最后调用删除函数删除定时器.

具体代码参照内核之旅上的相关代码.

【linux内核分析与应用-陈莉君】时钟中断机制_第7张图片

【linux内核分析与应用-陈莉君】时钟中断机制_第8张图片

【linux内核分析与应用-陈莉君】时钟中断机制_第9张图片

【linux内核分析与应用-陈莉君】时钟中断机制_第10张图片

【linux内核分析与应用-陈莉君】时钟中断机制_第11张图片

9.总结与参考资料与问题

【linux内核分析与应用-陈莉君】时钟中断机制_第12张图片

【linux内核分析与应用-陈莉君】时钟中断机制_第13张图片

【linux内核分析与应用-陈莉君】时钟中断机制_第14张图片

你可能感兴趣的:(操作系统,时钟中断机制)