Модуль ядра периодически вызывает программу пространства пользователя

Я хочу периодически вызывать программу из пользовательского пространства из модуля ядра. Но программа ядра замораживает систему, пока я пытаюсь ее загрузить.
следующая программа,

#include <linux/module.h>   /* Needed by all modules */
#include <linux/kernel.h>   /* Needed for KERN_INFO */
#include <linux/init.h>     /* Needed for the macros */
#include <linux/jiffies.h>
#include <linux/time.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>
#include <linux/hrtimer.h>
#include <linux/sched.h>
#include <linux/delay.h>

#define TIME_PERIOD 50000

static struct hrtimer hr_timer;
static ktime_t ktime_period_ns;

static enum hrtimer_restart timer_callback(struct hrtimer *timer){
char userprog[] = "test.sh";
char *argv[] = {userprog, "2", NULL };
char *envp[] = {"HOME=/", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL };
printk("\n Timer is running");
hrtimer_forward_now(&hr_timer, ktime_period_ns);

printk("callmodule: %s\n", userprog);
call_usermodehelper(userprog, argv, envp, UMH_WAIT_PROC);
return HRTIMER_RESTART;
}

static int __init timer_init() {
ktime_period_ns= ktime_set( 0, TIME_PERIOD);
hrtimer_init ( &hr_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL );
hr_timer.function = timer_callback;
hrtimer_start( &hr_timer, ktime_period_ns, HRTIMER_MODE_REL );
return 0;
}static int __exit timer_exit(){

int cancelled = hrtimer_cancel(&hr_timer);

if (cancelled)
printk(KERN_ERR "Timer is still running\n");
else
printk(KERN_ERR "Timer is cancelled\n");

}
module_init(timer_init);
module_exit(timer_exit);

MODULE_LICENSE("GPL");

test.sh — это скрипт, который просто повторяет комментарий.
Я тестировал часть call_usermodehelper и часть таймера по отдельности, и она работает нормально. Но пока я комбинирую два кода, система зависает.
Может кто-нибудь, пожалуйста, помогите мне решить проблему.

2

Решение

Быстрый осмотр убедительно показывает, что обратные вызовы hrtimer выполняются из контекста irq, что ожидается — как еще вы собираетесь получить высокое разрешение?

Но это также означает, что вы не должны блокировать, в то время как ваш обратный вызов может блокироваться из-за call_usermodehelper независимо от пройденного NOWAIT.

Похоже, вы тестируете свой модуль на ядре с отключенной отладкой, что в корне неверно.

Но это менее актуально, так как то, чего вы пытаетесь достичь, выглядит в корне неверно.

Я могу только порекомендовать вам уточнить, что является актуальной проблемой. Совершенно очевидно, что разветвление + освобождение связано с чем-то, требующим таймера высокого разрешения.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]