Таймеры в ядре 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.

Просмотров:   1971

Комментарии

Добавить комментарий

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
CAPTCHA
Введи эти символы. Ато роботы одолели!