2011-12-15 131 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来提供这些函数/变量。

希望这会有所帮助