linux 设备驱动程序 时间流 总结

本文详细探讨了Linux内核中的时间机制,包括如何获取当前时间、实现延迟操作以及调度异步函数在指定时间执行。重点解析了do_gettimeofday、xtime钟和jiffies在时间管理中的作用。
摘要由CSDN通过智能技术生成

第 6 章  时间流


至此,我们基本知道怎样编写一个功能完整的字符模块了。现实中的设备驱动程序,除了实现必需的操作外还要做更多工作,如计时、内存管理,硬件访问等等。幸好,内核中提供的许多机制可以简化驱动程序开发者的工作,我们将在后面几章陆续讨论驱动程序可以访问的一些内核资源。本章,我们先来看看内核代码是如何对时间问题进行处理的。按复杂程度递增排列,该问题包括:


  • 理解内核时间机制
  • 如何获得当前时间
  • 如何将操作延迟指定的一段时间
  • 如何调度异步函数到指定的时间后执行


6.1  内核中的时间间隔

我们首先要涉及的是时钟中断,操作系统通过时钟中断来确定时间间隔。中断是异步事件,通常由外部硬件触发。中断发生时,CPU 停止正在进行的任务,转而执行另一段特殊的代码(即中断服务例程,又称 ISR)来响应这个中断。中断和 ISR 的实现将在第 9 章讨论。

时钟中断由系统计时硬件以周期性的间隔产生,这个间隔由内核根据 HZ 的值设定,HZ 是一个与体系结构有关的常数,在文件 <linux/param.h> 中定义。当前的Linux版本为大多数平台定义的 HZ 的值是 100,某些平台上是 1024,IA-64 仿真器上是 20。驱动程序开发者不应使用任何特定的 HZ 值来计数,不管你的平台使用的是哪一个值。

当时钟中断发生时,变量 jiffies 的值就增加。jiffies 在系统启动时初始化为 0,因此,jiffies 值就是自操作系统启动以来的时钟滴答的数目,jiffies 在头文件 <linux/sched.h> 中被定义为数据类型为 unsigned long volatile 型变量,这个变量在经过长时间的连续运行后有可能溢出(不过现在还没有哪种平台会在运行不到 16 个月就使 jiffies 溢出)。为了保证 jiffies 溢出时内核仍能正常工作,人们已做了很多努力。驱动程序开发人员通常不用考虑 jiffies 的溢出问题,知道有这种可能性就行了。

如果想改变系统时钟中断发生的频率,可以修改 HZ 值。有人使用 Linux 处理硬实时任务,他们增加了 HZ 值以获得更快的响应时间,为此情愿忍受额外的时钟中断产生的系统开销。总而言之,时钟中断的最好方法是保留 HZ 的缺省值,因为我们可以完全相信内核的开发者们,他们一定已经为我们挑选了最佳值。

6.1.1  处理器特有的寄存器

如果需要度量非常短的时间,或是需要极高的时间精度,可以使用与特定平台相关的资源,这是将时间精度的重要性凌驾于代码的可移植性之上的做法。

大多数较新的 CPU 都包含一个高精度的计数器,它每个时钟周期递增一次。这个计数器可用于精确地度量时间。由于大多数系统中的指令执行时间具有不可预测性(由于指令调度、分支预测、缓存等等),在运行具有很小时间粒度的任务时,使用这个时钟计数器是唯一可靠的计时方法。为适应现代处理器的高速度,满足衡量性能指标的紧迫需求,同时由于 CPU 设计中的多层缓存引起的指令时间的不可预测性,CPU 的制造商们引入了记录时钟周期这一测量时间的简单可靠的方
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值