Таймеры в ядре Linux

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

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий