我可以看到兩件事情錯在這裏。首先,您在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
來提供這些函數/變量。
希望這會有所幫助