2011-12-15 3 views
-1

새로운 시스템 호출에서, 나는 각 영역의 통계 즉, vm_stat []에 접근하고 싶다.for_each_zone 리눅스 시스템 호출

#include <linux/mmzone.h> 
     my service{ 


    struct zone *mzone; 
     for_each_zone(mzone) 
      { 
       long l=mzone.vm_stat[NR_FREE_PAGES]; 
      } 

    } 

몇 가지 오류가 있습니다. 내가 vmscan.c에서 어떤 funcion를 호출 할 경우 메신저 방법 for_each_zone 매크로에 관해서는 완전히 혼란은 .. 그것을 할 수있는 방법이 될 것입니다 무슨 .. 둘째 .. myservice.c에서

및 호출 할 수

plzzz help .. 리눅스에 관한 모든 개념은 솔질이 필요합니다.

고마워요.

답변

0

여기 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을 사용하여이를 사용할 수 있다는 것을 잊지 마십시오.

희망이 도움이되었습니다.

관련 문제