for_each_zone用于linux系统调用

时间:2011-12-15 21:52:19

标签: linux-kernel

在新的系统调用中,我想访问每个区域的统计信息,即在vm_stat []中。

#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调用任何函数..那将是什么样的方法..

pzz帮助.. 关于linux的所有概念都需要刷牙。

由于

1 个答案:

答案 0 :(得分:0)

我可以在这里看到两件事情。首先,您在for循环中声明l。第二个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宏的工作原理。它在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的指针起作用,然后扩展为for循环,循环遍历每个区域。因此,您可以将其视为一个简单的for循环。

现在,正如我理解你的问题,你需要从内核源代码中调用my_service。内核有几个文件夹,您可以在其中放置源(fsipc等。)。最快捷的方法是选择其中一个文件夹并将.c文件放入其中。然后,您需要更改该文件夹中的Makefile,以便它还会编译您的.c。在此之后,您可能希望编写.h文件以向其他人提供您的功能。我建议把它放在include/linux里面。最后,您需要重新编译内核。不要忘记,如果您希望模块使用任何函数/变量,您可以始终使用宏EXPORT_SYMBOL来使这些模块可用。

希望这有帮助