编写一个内核模块启动一个定时器
题目介绍
本题目要求参与者编写一个Linux内核模块,该模块使用内核定时器(timer)来实现周期性的任务执行。内核定时器是Linux内核提供的一种机制,允许在指定的时间后执行某些操作,或者按照一定的时间间隔重复执行操作。
本题可参考第五章 Linux内核模块中的实现计时器
题目要求
- 编写一个内核模块,使用内核定时器实现周期性执行。
- 定时器应该在模块加载后5秒触发,并在每次触发时打印当前的jiffies(系统启动以来的时钟节拍数)。
- 每次触发后,定时器应重新设置为再次5秒后触发。
输入
无特定输入要求。
输出
- 定时器每次触发时,打印一条包含当前jiffies的消息。
示例
- 触发示例消息:
Timer callback function called [jiffies值].
代码介绍
-
timer.c 文件包含了内核模块的实现。
- 定义了一个
struct timer_list名为my_timer,用于管理定时器。 - 实现了
my_timer_callback函数,该函数在定时器触发时被调用,并打印当前的jiffies值。 - 设置了
my_timer_callback函数为my_timer的回调函数。
- 定义了一个
-
模块初始化函数
timer_init在模块加载时执行,需要在这里设置定时器。 -
模块退出函数
timer_exit在模块卸载时执行,删除定时器并打印卸载信息。
详细提示信息
-
定时器设置:
- 使用
mod_timer函数设置定时器的触发时间。 - 定时器首次设置需要在
timer_init函数中完成,并在5秒后触发。 - 在
my_timer_callback函数中重新设置定时器,以实现周期性触发。
- 使用
-
模块初始化和退出:
- 在
timer_init中设置定时器并打印加载信息。 - 在
timer_exit中删除定时器并打印卸载信息。
- 在
-
内核日志:
- 使用
printk函数打印内核日志信息。
- 使用
-
错误处理:
- 目前代码中没有错误处理,但实际编写时应注意可能的错误情况。
注意事项
- 确保定时器正确设置并能够周期性触发。
- 注意模块的初始化和退出函数中定时器的设置和删除。
- 使用内核日志函数
printk进行适当的信息输出。 - 参与者需要根据题目要求,完成定时器的设置和周期性任务的实现。通过编写内核模块,加深对Linux内核定时器机制的理解,并掌握内核模块的编写和测试流程。