2011-10-29 32 views
11

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

另外我找不到一个具体的工作队列示例。你能建议吗?

+3

一个优秀的博客解释了实例的所有基本的Linux内核的概念:http://tuxthink.blogspot.co.il/2011/09 /workqueues-1-introduction.html http://tuxthink.blogspot.co.il/2011/09/workqueue-2-declarework.html http://tuxthink.blogspot.co.il/2011/09/workqueue -3-using-runtime-creation.html – 0x90

回答

16

如果您想要将数据传递给您的工作队列功能,只需将work_struct结构嵌入您自己的数据结构中,并在工作函数中使用container_of即可检索它。

至于一个简单的例子,内核充满了它 - 只是git grep work_struct。你可以看一个简单的例子drivers/cpufreq/cpufreq.chandle_update函数)。下面还有文章嵌入了一个例子,在年底,但它不使用container_of,而是依赖于这样一个事实:结构的第一个成员具有相同的地址作为其母公司:

http://www.ibm.com/developerworks/linux/library/l-tasklets/index.html

+0

谢谢。它的工作原理非常简单。 – max

+0

http://www.makelinux.net/ldd3/chp-7-sect-6 - gothrough这个第二次阅读(只有工作队列) –

0

默认情况下,工作函数被称为以工作为参数。 在线程内,可以很容易地获得结构的数据元素。 另外一个Gnurou,为了访问更多的数据,可以将工作结构放在一个实现特定的结构中,并使用线程内部的宏容器访问所有的数据。

有关工作队列

worqueue是中断处理下半区mechanishm,在那里工作的一部分给一个内核线程与preemtion上的中断使能后执行一个简单的说明。 Percpu线程事件/ n是由内核创建的,线程也可以由驱动程序代码创建。一个结构用于标识线程,结构内部的一个重要参数是名称字段。它还包含一个per cpu结构,它在turn包含线程等待的waitqueue头和链接列表以添加定义工作的结构,即函数和数据。工作线程将该结构作为输入参数。线程运行并等待某人的等待队列唤醒线程。创建一个定义该功能的工作结构。当日程表中有一个 工作队列时,该结构被添加到链接列表的尾部并且工作线程被唤醒。在唤醒时,工作者线程遍历每个cpu结构中定义的链接列表,并开始执行以工作结构定义的函数作为参数。执行后,它将从链接列表中删除条目。

2

看起来好像已经解决了,为了理解如何使用工作队列,您对我非常有帮助。我给你一个简单的例子一些代码在我github上,希望这将有助于任何人:

https://github.com/m0r3n/kernel_modules/blob/master/workQueue.c

你可以用下面的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 

编辑: 我刚刚添加的延迟版本:

https://github.com/m0r3n/kernel_modules/blob/master/workQueueDelayed.c