3.xカーネルの新しいワークキューkworker/n;currentヘッダファイル、unrecognized ELF data encoding 0:

2458 ワード

今日linux-3.9.5でcurrent->commを使いたいのですが、current->pidではコンパイルが通らず、
追加する必要があります:
 #include
#include
その後、正常にコンパイルできますが、複数回のコンパイルを繰り返すと、次のエラーが発生します.
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_ワークはまったく仕事をする機会がなく、メモリリソースをかなり浪費し、cpu loadingを強化しています.また、同じワークqueue上の各ワークはシリアルで実行され、そのうちの1つのワークのスケジューラが眠っていると、後のワークも動作しません.
2.6.36以降、work queueのメカニズムが大きく変化し、すべてのwork queueが統合されました.
1つのwork queue、work threadもwork queueに関連付けられているわけではありません.workがいつ仕事をするかは、仕事の重要性と時間の緊迫性によって分けられています.すなわち、新しいメカニズムは、work queueではなくcpu数に基づいてwork threadを作成することである.
例:ワークキュー(デフォルトワークキューの印刷)--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]
",current->comm,current->pid); } static void do_work(struct work_struct *work){ printk(KERN_EMERG "init_work: [%s:%d]
",current->comm,current->pid); } static void do_delaywork(struct work_struct *work){ printk(KERN_EMERG "delaywork: [%s:%d]
",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!
"); destroy_workqueue(mywq); } module_init(kerneladdr); module_exit(kerneladdr_exit);