ここでは2つのことが間違っています。まず、forループ内にl
と宣言しています。 2番目のmzone
はポインタなので、.
の代わりに->
を使用してvm_stat
にアクセスする必要があります。さらにlong l
の代わりにatomic_long_t l
を使用してください。asm-generic/atomic-long.h
が必要です。それはここにあなたの例で動作するカーネルモジュールだ、言った:
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/mmzone.h>
#include <asm-generic/atomic-long.h>
int __init init_module(void){
struct zone *mzone;
atomic_long_t l
for_each_zone(mzone)
l = mzone->vm_stat[NR_FREE_PAGES];
return 0;
}
void __exit clean_module(void){
}
今、どのようfor_each_zone
マクロ作品のために。
#define for_each_zone(zone) \
for (zone = (first_online_pgdat())->node_zones; \
zone; \
zone = next_zone(zone))
あなたはそれがstruct zone
へのポインタを受信することにより動作し、それがその後、各ゾーンを通って、forループの中にいるであろうサイクルを拡大する見ることができるように:それは(カーネル3.1.5)としてlinux/mmzone.h
に定義されています。したがって、単純なforループと考えることができます。
私はあなたの質問を理解したので、my_service
をカーネルソースから呼び出す必要があります。カーネルには、ソースを置くことができるいくつかのフォルダがあります(fs
、ipc
など)。それらを実行する最も簡単な方法は、これらのフォルダの1つを選択し、.c
ファイルをその中に入れることです。その後、そのフォルダからMakefile
を変更して、.c
もコンパイルする必要があります。その後、.h
ファイルを作成して、他のユーザーに機能を提供したいと思うかもしれません。私はinclude/linux
の中に入れておくことをお勧めします。最後に、カーネルを再コンパイルする必要があります。モジュールに関数/変数のいずれかを使用させたい場合は、マクロEXPORT_SYMBOL
を使用してこれらを利用できることを忘れないでください。
希望すると便利です。