Linux设备驱动程序 之 度量时间差
概述
内核通过定时器中断来跟踪事件流;
时钟中断由系统定时硬件以及周期性的间隔产生,这个间隔由内核根据HZ的值设定,HZ是一个细节结构有关的常数;作为一般性规则,即使知道对应平台上的确切HZ值,也不应该在编程时依赖该HZ值;
如果想改变系统时钟中断发生的频率,可以通过修改HZ值来进行,但是,如果修改了头文件中的HZ值,则必须使用新的值重新编译内核以及所有模块;
每当时钟中断发生时,内核内部计数器的值增加一;这个计数器的值在系统引导值初始化为0,因此,它的值就是上次操作系统引导以来的时钟滴答数;这个计数器是一个64位变量(即使在32位架构上也是64位),称为jiffies_64;但是驱动程序发开者通常访问的是jiffies变量,它是unsigned long类型的变量,要么和jiffies_64相同,要么仅仅是jiffies_64的低23位,根据架构是64位还是32位而定;通常首选使用jiffies,因为对它的访问很快,从而对于64位jiffies_64值的访问并不需要在所有架构上都是原子的;
使用jiffies计数器
该计数器和读取计数器的工具函数包含在<linux/jiffies.h>中,但是通常只需要包含<linux/sched.h>文件,后者会自动包含jiffies.h;
需要说明的是,jiffies和jiffies_64均应该被看成只读变量;
在代码中需要记录jiffies的当前值时,可简单的访问上面说的unsigned long变量;该变量被声明为volatile,这样可以避免编译器对访问该变量的语句的优化;在代码需要计算未来的时间戳时,必须读取当前的计数器;
#incldue <linux/jiffies.h> unsigned long j, stamp_1, stamp_half, stamp_n; j = jiffies; stamp_1 = j + HZ;
stamp_half = j + HZ/;
stamp_n = j + n * HZ / ;
时间比较
只要采用正确的方式来比较不同的值,上述代码不会因为jiffies的溢出而出现问题;比较缓存时间和当前时间,应该使用下面宏:
#define time_after(a,b) \
(typecheck(unsigned long, a) && \
typecheck(unsigned long, b) && \
((long)((b) - (a)) < ))
#define time_before(a,b) time_after(b,a) #define time_after_eq(a,b) \
(typecheck(unsigned long, a) && \
typecheck(unsigned long, b) && \
((long)((a) - (b)) >= ))
#define time_before_eq(a,b) time_after_eq(b,a)
用户空间时间与内核时间的转换
用户空间的时间使用struct timeval和struct timespec来表示,为了在用户空间时间和内核时间之间进行转换,内核提供了下面的四个辅助函数:包含在<linux/jiffies.h>中
unsigned long timespec_to_jiffies(const struct timespec *value)
void jiffies_to_timespec(const unsigned long jiffies,
struct timespec *value) unsigned long timeval_to_jiffies(const struct timeval *value)
void jiffies_to_timeval(const unsigned long jiffies,
struct timeval *value)
访问jiffies_64
对jiffies_64的访问不像对jiffies的访问那么直接,在64位架构上,两个变量其实是同一个变量;但是在32位架构上,对64位的访问不是原子的,必须借助一个辅助函数,该函数完成了适当的锁定:
#if (BITS_PER_LONG < 64)
u64 get_jiffies_64(void);
#else
static inline u64 get_jiffies_64(void)
{
return (u64)jiffies;
}
#endif
Linux设备驱动程序 之 度量时间差的更多相关文章
- linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)
原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...
- 【转】linux设备驱动程序中的阻塞机制
原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275272.html 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经 ...
- Linux设备驱动程序 第三版 读书笔记(一)
Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...
- Linux设备驱动程序学习之分配内存
内核为设备驱动提供了一个统一的内存管理接口,所以模块无需涉及分段和分页等问题. 我已经在第一个scull模块中使用了 kmalloc 和 kfree 来分配和释放内存空间. kmalloc 函数内幕 ...
- 教你写Linux设备驱动程序:一个简短的教程
教你写Linux设备驱动程序:一个简短的教程 http://blog.chinaunix.net/uid-20799298-id-99675.html
- linux设备驱动程序_hello word 模块编译各种问题集锦
在看楼经典书籍<linux设备驱动程序>后,第一个程序就是编写一个hello word 模块. 原以为非常easy,真正弄起来,发现问题不少啊.前两天编过一次,因为没有记录,今天看的时候又 ...
- Linux设备驱动程序学习----1.设备驱动程序简介
设备驱动程序简介 更多内容请参考Linux设备驱动程序学习----目录 1. 简介 Linux系统的优点是,系统内部实现细节对所有人都是公开的.Linux内核由大量复杂的代码组成,设备驱动程序可以 ...
- Linux设备驱动程序学习----2.内核模块与应用程序的对比
内核模块与应用程序的对比 更多内容请参考Linux设备驱动程序学习----目录 1. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模 ...
- Linux设备驱动程序学习----3.模块的编译和装载
模块的编译和装载 更多内容请参考Linux设备驱动程序学习----目录 1. 设置测试系统 第1步,要先从kernel.org的镜像网站上获取一个主线内核,并安装到自己的系统中,因为学习驱动程序的编写 ...
随机推荐
- pthread 编程基础
Linux系统下的多线程遵循POSIX线程接口,称为pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a.与vxworks上任务的概 ...
- nexus 绑定负载均衡nginx反向代理后 遇到的https问题。
1.今天搭建maven私服,下载安装好nexus运行后,通过IP可以直接访问,没有问题,如:http://123.123.123.123:8081 就可以进入主页面.没有任何问题. 2.但是他默认是h ...
- JDK + Tomcat 安装 + 制作自定义镜像【第 2 篇 Tomcat】
[第 1 篇 JDK]:https://www.cnblogs.com/del88/p/11842387.html[第 2 篇 Tomcat]:https://www.cnblogs.com/del8 ...
- VS Code 运行 JavaScript 文件时出现“node...”乱码或错误
1.错误图片: 2.如果是中文乱码的话,可以到设置里边把「Auto Guess Encoding」这一项勾起来. 3.如果不是这个原因,可能是因为没安装 Node.js 和配置 Node.js 环境, ...
- 如何部署自定义的servlet
1 首先找到与exlipse绑定的tomcat安装位置 2 打开web.xml添加如下信息: <display-name>servletDemo</display-name> ...
- asp.net 自动检测缓存内容是否变化
1 使用cache.Insert方法时,新建一个System.Web.Caching.CacheDependency对象,告诉缓存,当缓存的内容发生变化时,将删除缓存,并重新缓存 using Syst ...
- 【2017-06-02】Linq高级查询,实现分页组合查询。
1.以XXX开头 2.以XXX结尾 3.模糊查询 4.求个数 5.求最大值 6.求最小值 7.求平均值 8.求和 9.升序 10.降序 11.分页 Skip()跳过多少条 Take()取多少条 12. ...
- Hadoop_13_Hadoop Shell脚本采集日志上传到HDFS
案例1:开发shell采集脚本 1.点击流日志每天都10T,在业务应用服务器上,需要准实时上传至数据仓库(Hadoop HDFS)上 2.一般上传文件都是在凌晨24点操作,由于很多种类的业务数据都要在 ...
- [Abp vNext微服务实践] - 启动流程
前几篇分别介绍了abp vNext微服务框架和微服务CI/CD环境搭建,本篇开始介绍vNext微服务框架的开发环境搭建. 环境准备 官方介绍的系统架构图如下: 上图中身份服务和网关服务已经集成在系统中 ...
- LoadRunner(2)
一.性能测试的基本概念 1.并发和在线的区别:并发的压力是一种瞬时压力,一般针对同一类型业务:在线的压力是一段时间的压力,没有并发那么集中. 规律:一般20用户并发产生的压力相当于200用户在线的压力 ...