1

在这篇文章之后,我在我的内核模块中实现了:

static int val = 1;
static char thread_name[128] = "my thread name";

在初始化中:

thread1 = kthread_run(thread_fn, &val, thread_name);

这就是功能

int thread_fn(void *data)
{
    unsigned long j0,j1;
    int delay = 60*HZ;
    j0 = jiffies; 
    j1 = j0 + delay; 

    printk(KERN_INFO "here");

    while (time_before(jiffies, j1)) 
        schedule();
    return 1;
}

为什么这只执行1次?

4

2 回答 2

1

这是任何线程的正常行为。如果你想要一个周期性的行为,你需要一个循环thread_fn
这是一个很好的内核线程文档:https ://prof.hti.bfh.ch/myf1/adv-linux/courseNotes/kthread-intro-1.2.pdf

于 2013-03-07T20:48:46.813 回答
1

基于对如何在 rmmod 上停止 Linux 内核线程的公认答案?,以及我自己的一些闲逛,我怀疑有两个可能的原因:

  1. 您的函数返回。

  2. 你的线程状态是TASK_INTERRUPTIBLE,所以调用schedule()永远不会返回。

如果您将主体包装在一个while (! kthread_should_stop() )循环中,并确保您的任务在TASK_RUNNING调用之前处于状态schedule(),那么它将继续运行:

int thread_fn(void *data)
{
    unsigned long j1;
    int delay = 5*HZ;  /* use a 5-second delay instead of a 60-sec one */

    int count = 0;
    while (! kthread_should_stop() ) {
        j1 = jiffies + delay; 

        printk(KERN_INFO "here %d\n", ++count);

        while (time_before(jiffies, j1)) {
            set_current_state(TASK_RUNNING);
            schedule();
        }
    }
    return 1;
}
于 2013-03-07T20:51:55.513 回答