В этой статье пойдет речь о таймерах. В ядре 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.




