内核有一个定时器的实现,可以实现在N个jiffies之后执行某个任务。
实现:kernel/timer.c
头文件:include/linux/timer.h
核心数据结构:struct timer_list
主要操作函数:init_timer,add_timer,del_timer_sync,mod_timer
demo 如下:
1 #include <linux/timer.h>
2 #include <linux/module.h>
3
4 struct timer_list timer;
5
6 static void func(unsigned long p)
7 {
8 printk("LZJ:jiffies in func %ld\n",jiffies);
9 }
10
11 static int __init timer_init(void)
12 {
13 init_timer(&timer);
14 timer.expires=jiffies+1000;
15 timer.data=(unsigned long)timer.expires-jiffies;
16 timer.function=func;
17
18 printk("LZJ:jiffies now:%ld\n",jiffies);
19
20 add_timer(&timer);
21 return 1;
22 }
23
24 static void __exit timer_exit(void)
25 {
26 del_timer_sync(&timer);
27 printk("LZJ:timer exit\n");
28 }
29
30 MODULE_AUTHOR("zhijie Li");
31 MODULE_DESCRIPTION("This is a linux kernel timer test.");
32 MODULE_LICENSE("Dual BSD/GPL");
33 module_init(timer_init);
34 module_exit(timer_exit);
|
编译后insmod,输出结果如下:
lzj@lzj-laptop:~/documents/kernel_timer$ dmesg | grep "LZJ"
[ 2460.886284] LZJ:jiffies now:540221
[ 2464.884061] LZJ:jiffies in func 541221
正好相差1000.
一个低级错误:开始我把
struct timer_list timer 定义放在timer_init函数中,这个函数当insmod的时候执行。每次刚insmod,系统就挂掉。原因如下:
如果把timer作为局部变量,它的内存将分配在堆栈上,然后给它赋值(其中包括func),当1000个jiffies之后这个函数已经结束,堆栈释放。此时timer已经不存在。
阅读(786) | 评论(0) | 转发(0) |