2011-12-15 13 views
-1

で使用された場合、私は各ゾーンの統計、つまりvm_stat []にアクセスしたいと考えています。for_each_zoneが新しいシステムコールでlinuxシステムコール

#include <linux/mmzone.h> 
     my service{ 


    struct zone *mzone; 
     for_each_zone(mzone) 
      { 
       long l=mzone.vm_stat[NR_FREE_PAGES]; 
      } 

    } 

いくつかのエラーがあります。 myservice.cから呼び出されるかfor_each_zoneマクロのように完全に混乱してイム..

と私はvmscan.cから任意のfuncionを呼び出したい場合は、第二..何がそれを行うための方法だろう。..

plzzz help .. 私のLinuxに関するすべての概念はブラッシングが必要です。

ありがとうございました

答えて

0

ここでは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をカーネルソースから呼び出す必要があります。カーネルには、ソースを置くことができるいくつかのフォルダがあります(fsipcなど)。それらを実行する最も簡単な方法は、これらのフォルダの1つを選択し、.cファイルをその中に入れることです。その後、そのフォルダからMakefileを変更して、.cもコンパイルする必要があります。その後、.hファイルを作成して、他のユーザーに機能を提供したいと思うかもしれません。私はinclude/linuxの中に入れておくことをお勧めします。最後に、カーネルを再コンパイルする必要があります。モジュールに関数/変数のいずれかを使用させたい場合は、マクロEXPORT_SYMBOLを使用してこれらを利用できることを忘れないでください。

希望すると便利です。