2011-12-15 191 views
-1

,我想訪問每個區域的統計信息,即在vm_stat []中。linux系統中使用的for_each_zone在新系統調用中調用

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


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

    } 

給出了幾個錯誤。 IM完全困惑,如何for_each_zone宏從myservice.c被稱爲..

;其次,如果我想打電話從vmscan.c任何funcion ..什麼是做它的方式..

plzzz幫助.. 我所有關於linux的概念都需要刷牙。

感謝

回答

0

我可以看到兩件事情錯在這裏。首先,您在for循環中聲明l。第二個mzone是一個指針,因此您需要使用->而不是.來訪問vm_stat。另外,您應該使用atomic_long_t l而不是long 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宏的工作方式。它在linux/mmzone.h定義爲(內核3.1.5):

#define for_each_zone(zone)        \ 
     for (zone = (first_online_pgdat())->node_zones; \ 
      zone;          \ 
      zone = next_zone(zone)) 

正如你可以看到它的工作原理是接收一個指向struct zone,然後通過每個區域擴展爲一個循環,這將循環。因此,您可以將其視爲簡單的循環。

現在,我理解你的問題,你需要在內核源碼中調用my_service。內核有幾個文件夾,您可以放置​​源文件(fsipc等)。最快的方法是選擇這些文件夾中的一個,並將其中的.c文件放入其中。然後,您需要從該文件夾更改Makefile,以便它還編譯您的.c。在此之後,您可能需要編寫一個.h文件以向其他人提供您的功能。我會建議把它放在include/linux之內。最後,你需要重新編譯內核。不要忘記,如果您希望模塊使用您的任何函數/變量,您可以始終使用宏EXPORT_SYMBOL來提供這些函數/變量。

希望這會有所幫助