我可以看到两件事情错在这里。首先,您在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
。内核有几个文件夹,您可以放置源文件(fs
,ipc
等)。最快的方法是选择这些文件夹中的一个,并将其中的.c
文件放入其中。然后,您需要从该文件夹更改Makefile
,以便它还编译您的.c
。在此之后,您可能需要编写一个.h
文件以向其他人提供您的功能。我会建议把它放在include/linux
之内。最后,你需要重新编译内核。不要忘记,如果您希望模块使用您的任何函数/变量,您可以始终使用宏EXPORT_SYMBOL
来提供这些函数/变量。
希望这会有所帮助