编写一个内核模块启动一个定时器

题目介绍

本题目要求参与者编写一个Linux内核模块,该模块使用内核定时器(timer)来实现周期性的任务执行。内核定时器是Linux内核提供的一种机制,允许在指定的时间后执行某些操作,或者按照一定的时间间隔重复执行操作。

本题可参考第五章 Linux内核模块中的实现计时器

题目要求

  • 编写一个内核模块,使用内核定时器实现周期性执行。
  • 定时器应该在模块加载后5秒触发,并在每次触发时打印当前的jiffies(系统启动以来的时钟节拍数)。
  • 每次触发后,定时器应重新设置为再次5秒后触发。

输入

无特定输入要求。

输出

  • 定时器每次触发时,打印一条包含当前jiffies的消息。

示例

  • 触发示例消息:
    Timer callback function called [jiffies值].
    

代码介绍

  1. timer.c 文件包含了内核模块的实现。

    • 定义了一个 struct timer_list 名为 my_timer,用于管理定时器。
    • 实现了 my_timer_callback 函数,该函数在定时器触发时被调用,并打印当前的jiffies值。
    • 设置了 my_timer_callback 函数为 my_timer 的回调函数。
  2. 模块初始化函数 timer_init 在模块加载时执行,需要在这里设置定时器。

  3. 模块退出函数 timer_exit 在模块卸载时执行,删除定时器并打印卸载信息。

详细提示信息

  • 定时器设置

    • 使用 mod_timer 函数设置定时器的触发时间。
    • 定时器首次设置需要在 timer_init 函数中完成,并在5秒后触发。
    • my_timer_callback 函数中重新设置定时器,以实现周期性触发。
  • 模块初始化和退出

    • timer_init 中设置定时器并打印加载信息。
    • timer_exit 中删除定时器并打印卸载信息。
  • 内核日志

    • 使用 printk 函数打印内核日志信息。
  • 错误处理

    • 目前代码中没有错误处理,但实际编写时应注意可能的错误情况。

注意事项

  • 确保定时器正确设置并能够周期性触发。
  • 注意模块的初始化和退出函数中定时器的设置和删除。
  • 使用内核日志函数 printk 进行适当的信息输出。
  • 参与者需要根据题目要求,完成定时器的设置和周期性任务的实现。通过编写内核模块,加深对Linux内核定时器机制的理解,并掌握内核模块的编写和测试流程。