Linux设备驱动程序 之 内核定时器
综述
如果需要在将来的某个时间点调度执行某个动作,同时在该时间点到达之前不会阻塞当前进程,则可以使用内核定时器;
内核定时器是一个数据结构,它告诉内核在用户定义的时间点使用用户定义的参数来执行一个用户定义的函数;
被调度运行的函数几乎肯定不会再注册这些函数的进程正在执行时运行,相反,这些函数会异步的运行;当定时器运行时,调度该定时器的进程可能正在休眠或在其他处理器上执行,或已经退出;
内核定时器常常是作为“软中断”的结果而运行的;在这种原子性上下文中运行时,代码会受到很多限制;
许多动作需要在进程上下文中才能执行,如果处于进程上下文之外,则必须遵守以下规则:
1. 不允许访问用户空间;因为没有进程上下文,无法将任何特定进程与用户空间关联起来;
2. current指针在原子模式下是没有任何意义的;也是不可用的,因为相关代码和被中断的进程没有任何关联;
3. 不能执行休眠或者调度;原子代码不可以调用shcedule或者wait_event,也不能调用任何可能引起休眠的函数;例如,调用kmalloc(…,GFP_KERNEL)就不符合本规则;信号量也不能用,因为可能引起休眠;
内核可以通过调用函数in_interrupt()来判断自己是否正运行于中断上下文,该函数无需参数,如果处理器运行在中断上下文,则返回非0值,无论是硬件中断还是软件中断;
和in_interrupt()相关的函数是in_atomic(),当函数返回非0值时,调度不被允,即处于原子上下文,包括硬件和软件中断上下文以及拥有自旋锁的任何时间点,在后一种情况下,current可能是可用的,但是禁止访问用户空间,因为会导致调度的发生;在使用in_interrupt()的时间点,都应该考虑是否真正的该使用的是in_atomic();
内核定时器的另一个重要特征是,任务可以将自己注册以后再稍后的时间重新运行,这种可能性是因为timer_list结构会在运行之前从活动定时器链表中移走,这样就可以立即链入其他链表;
在SMP系统中,定时器函数会由注册它的同一CPU执行,这样可以尽可能的获得缓存的局域性;因此,一个注册自己的定时器始终会在同一CPU上运行;
即使在单处理器系统上,定时器也会是竞态的潜在来源;这是由其异步执行的特点直接导致的;因此,任何通过定时器函数访问的数据结构都应该针对并发访问进行保护;
定时器API
内核为驱动程序提供了一组用来声明、注册和删除定时器的函数,下面为部分摘取:
struct timer_list {
/*
* All fields that change during normal runtime grouped to the
* same cacheline
*/
struct hlist_node entry;
unsigned long expires; /* 超时时间 */
void (*function)(unsigned long); /* 超时回调 */
unsigned long data; /* 回调参数 */
u32 flags; /* 标志 */
#ifdef CONFIG_LOCKDEP
struct lockdep_map lockdep_map;
#endif
};
/* 静态定义初始化 */
#define DEFINE_TIMER(_name, _function, _expires, _data) /* 只初始化,初始化之后再设置结构的回调,超时等 */
#define init_timer(timer) /* 初始化,设置回调,未设置超时 */
#define setup_timer(timer, fn, data) /* 添加定时器,开始工作 */
void add_timer(struct timer_list *timer) /* 未超时之前,可修改定时器的超时时间 */
int mod_timer(struct timer_list *timer, unsigned long expires) /* 删除定时器 */
int del_timer(struct timer_list * timer)
Linux设备驱动程序 之 内核定时器的更多相关文章
- Linux设备驱动程序 之 内核符号表
insmod使用公共内核符号表来解析模块中未定义的符号.功能内核符号表中包含了所有全局内核项(函数和变量)的地址,这是实现模块化驱动程序所必须的.当模块装载到内核后,它所导出的任何符号都会变成内核符号 ...
- 嵌入式Linux设备驱动程序:编写内核设备驱动程序
嵌入式Linux设备驱动程序:编写内核设备驱动程序 Embedded Linux device drivers: Writing a kernel device driver 编写内核设备驱动程序 最 ...
- linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)
原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...
- Linux设备驱动程序学习----2.内核模块与应用程序的对比
内核模块与应用程序的对比 更多内容请参考Linux设备驱动程序学习----目录 1. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模 ...
- 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序
嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...
- 【转】linux设备驱动程序中的阻塞机制
原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275272.html 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经 ...
- 如何编写Linux设备驱动程序
一.Linux device driver 的概念 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口.设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看 ...
- Linux设备驱动程序 第三版 读书笔记(一)
Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...
- Linux设备驱动程序学习之分配内存
内核为设备驱动提供了一个统一的内存管理接口,所以模块无需涉及分段和分页等问题. 我已经在第一个scull模块中使用了 kmalloc 和 kfree 来分配和释放内存空间. kmalloc 函数内幕 ...
随机推荐
- 实现Bootstrap表格拖拽
实现Bootstrap表格拖拽: 需要引入jquery.min.js.bootstrap相关文件,以及jquery.dragsort-0.5.2.js 代码如下: <html> <h ...
- Java 面向对象(六)接口
一.接口 接口:是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量.构造方法和成员方法,那么接口的内部主要就是封装了方法,包含抽象方法(JDK 7及以前),默认方法和静态方法(J ...
- CentOS 7 配置VNCServer
因为一直在用xmanager ,所以CentOS 7 上没过VNCSserver了,最近安装Oracle19C ,xmanager 总是卡死,所以配置VNC. 发现仅仅yum install -y t ...
- C#开发windows服务如何调试——资料整理
原文标题:C# Windows服务程序如何进行调试 原文地址:https://jingyan.baidu.com/article/456c463b18e1b00a583144b3.html 第一种: ...
- SQL Join 理解
对各种连接的理解,可以参照文章. 下面是对连接结果表条数统计的思考:假设有主表Ta有5条记录,从表Tb有4条记录 Ta corss join Tb, 结果为2表做笛卡尔积,5*4=20条 /*下面其它 ...
- Nginx中ngx_stream_core_module和ngx_stream_proxy_module
ngx_stream_core_module模块该模块模拟基于tcp或udp的服务连接的反向代理理,即⼯工作于传输层的调度器器指令:17.1 streamSyntax: stream { ... }D ...
- Linux文件系统之install(复制文件和设置文件属性)
install命令 install命令的作用是安装或升级软件或备份数据,它的使用权限是所有用户.install命令和cp命令类似,都可以将文件/目录拷贝到指定的地点.但是,install允许你控制目标 ...
- linux 优化
如何优化Linux系统? 1)不用root超级用户登录,添加普通用户,通过sudo授权管理:/etc/sudoers 2)更改默认的远程连接ssh服务端口号,禁止root用户远程登录到服务器:/etc ...
- python自动华 (十)
Python自动化 [第十篇]:Python进阶-多进程/协程/事件驱动与Select\Poll\Epoll异步IO 本节内容: 多进程 协程 事件驱动与Select\Poll\Epoll异步IO ...
- C语言学习笔记5-程序结构
本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/50752148 作者:jadeshu 邮箱: jades ...