关闭

3.x 内核新工作队列kworker/n ;current头文件,unrecognized ELF data encoding 0:

1620人阅读 评论(0) 收藏 举报
分类:

今天在linux-3.9.5上想用current ->comm,current->pid时,编译不通过,

需添加:

 #include <linux/kthread.h>

#include<asm/current.h>


之后可以正常编译通过,但是重复多次编译时,会出下如下错误:

unrecognized ELF data encoding 0: 

这是编译器cache的问题:

需执行:

ccache -c 


工作队列:

虽然自从2.6.0之后,Linux对work queue进行了优化,但是kernel用到create_workqueue的模块越来越多,而调用create_workqueue会在每个cpu上都创建一个work_thread, 每个cpu都分配一个cpu_workqueue_struct以及workqueue_struct,而如果没被queue_work的话根本没机会工作,这样仍然相当浪费内存资源,而且加重了cpu loading。另外,同一个work queue上的每个work都是按照串行执行的,假如其中一个work的调度程序睡眠了,那么后面的work也将无法工作。

自从2.6.36以后,work queue的机制发生了很大变化,所有的work queue都被合并成

一个work queue,work thread也不是和work queue一一关联,work何时工作紧紧按照工作的重要性以及时间紧迫性来划分。也就是说新机制是按照cpu数量来创建work thread,而不是work queue。


例:工作队列(打印默认工作队列)--linux-3.9上默认工作线程名是kworker/n ,不再是2.6系列上的 event/n

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/workqueue.h>
#include <asm/current.h>
#include <linux/kthread.h>
#include <linux/sched.h>
static void do_declarework(struct work_struct *work){
  printk(KERN_EMERG "declarework: [%s:%d]\n",current->comm,current->pid);

}
static void do_work(struct work_struct *work){
  printk(KERN_EMERG "init_work: [%s:%d]\n",current->comm,current->pid);

}
static void do_delaywork(struct work_struct *work){
  printk(KERN_EMERG "delaywork: [%s:%d]\n",current->comm,current->pid);
 
}
struct work_struct cgmwork;
struct delayed_work cgmdelaywork;
struct workqueue_struct *mywq;
static int __init kerneladdr(void){
        DECLARE_WORK(cgmdeclarework,do_declarework);

        INIT_WORK(&cgmwork,do_work);

        INIT_DELAYED_WORK(&cgmdelaywork,do_delaywork);

        schedule_work(&cgmdeclarework);
        schedule_work(&cgmwork);
        schedule_delayed_work(&cgmdelaywork,5);
        flush_scheduled_work();

	mywq=alloc_workqueue("mywq",0,0);
	queue_work(mywq,&cgmwork);
	flush_workqueue(mywq);
        return 0;
}

static void __exit kerneladdr_exit(void){
        printk(KERN_ALERT"Entry kerneladdr_exit!\n");
	destroy_workqueue(mywq);
}

module_init(kerneladdr);
module_exit(kerneladdr_exit);




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:155269次
    • 积分:2342
    • 等级:
    • 排名:第16501名
    • 原创:70篇
    • 转载:58篇
    • 译文:7篇
    • 评论:5条
    最新评论