В этой статье пойдет речь о таймерах. В ядре Linux есть несколько разновидностей таймеров.
Мы займемся наиболее бородатыми таймерами.
Сразу хочу отметить, что о точности говорить не приходится. Получить же времена меньше системного тика вообще не получилось.
Создадим модуль ядра, который при загрузке настраивает таймер, по срабатыванию выведем сообщение в dmesg.
Makefile будем использовать от старых примеров. Можете найти его тут или на GitHub по ссылке в конце статьи.
Подключаем заголовки.
#include <linux/init.h> #include <linux/module.h> #include <linux/timer.h> #include "blablamod.h"
Объявляем структуру для работы с таймером и функцию — обработчик переполнения таймера.
static struct timer_list my_timer; void my_timer_callback(unsigned long data) { printk(KERN_NOTICE "my_timer_callback called (%ld): %lu.\n", jiffies, data); }
Как видите функция обработчик принимает параметр.
Функция инициализации модуля.
static int __init blablamod_init( void ) { int ret; printk(KERN_NOTICE "BlablaModule loaded!\n"); // my_timer, function, data setup_timer( &my_timer, my_timer_callback, 10 ); printk(KERN_NOTICE "Starting timer to fire in 200ms (%ld)\n", jiffies); ret = mod_timer(&my_timer, jiffies + msecs_to_jiffies(200)); if (ret) printk(KERN_ALERT "Error in mod_timer\n"); return 0; }
Тут мы настраиваем таймер при помощи функции setup_timer. Передаем её нашу структуру, функцию обработчик и параметр (в данном случае 10).
Затем мы «заводим» таймер. Скармливаем структуру my_timer, и время срабатывания. Время вычисляем путем сложения текущего счетчика тиков jiffies со результатом функции msecs_to_jiffies, которая преобразовывает значение в миллисекундах в тики счетчика.
Функция выгрузки.
static void __exit blablamod_exit( void ) { int ret = del_timer( &my_timer ); if (ret) printk(KERN_ALERT "The timer is still in use...\n"); printk(KERN_NOTICE "BlablaModule unloaded!\n" ); }
Как видите выгружая модуль нужно удалить таймер.
Регистрация функций загрузки и выхода.
module_init( blablamod_init ); module_exit( blablamod_exit );
Собирать командой.
make
Запускать.
sudo insmod blablamod.ko
Вывод dmesg.
[ 2451.721607] BlablaModule loaded! [ 2451.721612] Starting timer to fire in 200ms (4297117690) [ 2451.920853] my_timer_callback called (4297117890): 10.
Код примера на GitHub.