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
#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);