在新的系统调用中,我想访问每个区域的统计信息,即在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的所有概念都需要刷牙。由于
答案 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
。内核有几个文件夹,您可以在其中放置源(fs
,ipc
等。)。最快捷的方法是选择其中一个文件夹并将.c
文件放入其中。然后,您需要更改该文件夹中的Makefile
,以便它还会编译您的.c
。在此之后,您可能希望编写.h
文件以向其他人提供您的功能。我建议把它放在include/linux
里面。最后,您需要重新编译内核。不要忘记,如果您希望模块使用任何函数/变量,您可以始终使用宏EXPORT_SYMBOL
来使这些模块可用。
希望这有帮助