Linux kernel 如何使用Linux工作队列

Linux kernel 如何使用Linux工作队列,linux-kernel,kernel,Linux Kernel,Kernel,Linux工作队列是指具有进程上下文的内核级线程。我试图用它来替代没有特定进程上下文的kthread。但如何将数据传递到工作队列?work_struct有一个类型为atomic_long_t的数据字段。我无法将指针传递到此字段。我该怎么做 我也找不到一个工作队列的具体例子。您能推荐一个吗?如果您想将数据传递给工作队列函数,只需将工作结构嵌入您自己的数据结构中,并在工作函数中使用容器来检索它 作为一个简单的例子,内核中充满了它-只是git grep work\u struct。您可以查看drive

Linux工作队列是指具有进程上下文的内核级线程。我试图用它来替代没有特定进程上下文的kthread。但如何将数据传递到工作队列?work_struct有一个类型为atomic_long_t的数据字段。我无法将指针传递到此字段。我该怎么做


我也找不到一个工作队列的具体例子。您能推荐一个吗?

如果您想将数据传递给工作队列函数,只需将
工作结构嵌入您自己的数据结构中,并在工作函数中使用
容器来检索它

作为一个简单的例子,内核中充满了它-只是
git grep work\u struct
。您可以查看
drivers/cpufreq/cpufreq.c
handle\u update
函数)了解一个简单的示例。下面的文章最后还嵌入了一个示例,但它没有使用
容器,而是依赖于结构的第一个成员与其父成员具有相同的地址这一事实:


默认情况下,调用work函数时,将work Stroked作为参数。 在线程内部,可以很容易地获得结构的数据元素。 同样是Gnurou,为了访问更多数据,可以将work结构放在特定于实现的结构中,并使用线程中的宏容器来访问所有数据

关于工作队列的简单描述

worqueue是中断处理下半部分机制,其中一部分工作交给内核线程,以便稍后在中断启用时执行抢占。 percpu线程事件/n由内核创建,线程也可以由驱动程序代码创建。一个结构用于标识线程,结构中的一个重要参数是name字段。它还包含一个每cpu结构,该结构依次包含线程等待的waitqueue头和一个链接列表,用于添加定义工作的结构,即函数和数据。工作线程将该结构作为输入参数。线程运行并等待等待某人唤醒线程的等待队列。创建一个工作结构来定义功能。当
工作队列是调度,结构被添加到链接列表的尾部,工作线程被唤醒。唤醒时,工作线程运行在每cpu结构中定义的链接列表中,并开始执行以工作结构作为参数定义的函数。执行后,它将从链接列表中删除条目。

这似乎已解决,您为我了解如何使用工作队列提供了很大帮助。我将在我的github中为您提供一些简单示例的代码,希望它对任何人都有帮助:

可以使用以下Makefile进行编译:

KVERSION = $(shell uname -r)
obj-m = workQueue.o

all:
    make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
    make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean
通过以下方式插入模块:

# sync; insmod workQueue.ko; sync
并查看日志:

# tailf /var/log/kern.log
编辑: 我刚刚添加了延迟版本:


一个优秀的博客用例子解释了所有基本的linux内核概念:上面的博客充满了广告和打字。。。这里有一个更好的参考(LDD3):上面的链接似乎是死的。这看起来像是新的: