여기 2 가지가 잘못 표시됩니다. 먼저 for 루프 안에 l
을 선언하고 있습니다. 두 번째 mzone
은 포인터이므로 에 액세스하려면 .
대신 ->
을 사용해야합니다. 또한 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
매크로 작품.
#define for_each_zone(zone) \
for (zone = (first_online_pgdat())->node_zones; \
zone; \
zone = next_zone(zone))
당신이이 struct zone
에 대한 포인터를 수신하여 작동하고 각 영역을 통해, for 루프에있는 것이다주기를 확장 볼 수 있듯이 : 그것은 (커널 3.1.5)로 linux/mmzone.h
에 정의되어 있습니다. 따라서 간단한 for 루프로 생각할 수 있습니다.
자, 질문을 이해 했으니 커널 소스에서 my_service
으로 전화해야합니다. 커널에는 소스를 넣을 수있는 폴더가 여러 개 있습니다 (fs
, ipc
등). 가장 빠른 방법은이 폴더 중 하나를 선택하여 .c
파일을 그 안에 넣는 것입니다. 그런 다음 해당 폴더에서 Makefile
을 변경하여 .c
도 컴파일해야합니다. 이 후에 다른 사람에게 기능을 제공하기 위해 .h
파일을 작성하려고합니다. 나는 include/linux
안에 넣는 것이 좋습니다. 마지막으로 커널을 다시 컴파일해야합니다. 모듈이 여러분의 함수/변수를 사용하기를 원한다면 항상 매크로 EXPORT_SYMBOL
을 사용하여이를 사용할 수 있다는 것을 잊지 마십시오.
희망이 도움이되었습니다.