2013-10-25 4 views
0

포함

#include<linux/module.h> 
#include<linux/init.h> 

int my_init(void){ 
     printk("<1> Angus : Module Insertion is successful!"); 
     return 0; 
} 

void my_cleanup(void){ 
     printk("<1> Angus : Module unloading successful!"); 
} 

module_init(my_init); 
module_cleanup(my_cleanup); 

메이크 :리눅스 디바이스 드라이버에 간단한 프로그램

obj-m:=simple.o 
aoll: 
     make -C /usr/src/linux-headers-3.2.0-25-generic-pae/ M=$(PWD) modules 
clean: 

     make -C /usr/src/linux-headers-3.2.0-25-generic-pae/ M=$(PWD) clean 

있도록 -C =>이 경로는/usr/SRC에서 메이크업, 을하기 전에 디렉토리 변경됩니다 /linux-headers-3.2.0-25-generic-pae/ Makefile이 있는데 M = $ (PWD)가 필요한 이유는 무엇입니까? 그것은 무엇을합니까, 어디에서 $ PWD를 확인할 수 있습니까? /usr/src/linux-headers-3.2.0-25-generic-pae/에있는 Makefile은 all : 모듈과 target 모듈을 모두 대상으로하며 대상을 깨끗하게 유지합니다. obj-m이란 무엇입니까?

답변

2

Linux 장치 드라이버 제 3 판 (자유롭게 http://oreilly.com/openbook/linuxdrive3/book/index.html에서 사용 가능)의 24 페이지 단락을 읽는 것이 좋습니다.

-C 옵션을 사용하면 제공된 디렉토리로 디렉토리를 변경할 수 있습니다. 여기서 커널의 최상위 Makefile을 찾습니다. 그런 다음 M = 옵션을 사용하면 모듈 대상 ($ PWD은 현재 디렉토리의 경로가 포함 된 변수)을 빌드하기 전에 Makefile이 모듈 소스 디렉토리로 다시 이동합니다.

obj-m은 빌드 할 커널 모듈 목록을 포함하는 변수입니다 (https://www.kernel.org/doc/Documentation/kbuild/makefiles.txt 참조).

1

당신은 당신의 메이크 규칙을 변경할 수 있습니다 다음 M= option causes that makefile to move back into your module source directory before trying to build the modules target

aoll: 
    (cd /usr/src/linux-headers-3.2.0-25-generic-pae/;echo $(PWD);make m=$(PWD) module) 
+0

폴 에반스 감사합니다. – Angus

+0

"대답이 아닙니다"라고 표시된 이유는 무엇입니까? 그것은 나에게 잘 보인다. – LarsH

+0

@LarsH : 동의합니다, 대답입니다, 그냥 잘못되었습니다. :-) 문제는'Makefile '에있는 세 개의 별도 명령 행이 세 개의 별개 쉘 명령에 의해 실행된다는 것입니다. 첫 번째'cd'가 실행 된 다음 쉘이 종료되고 다시 원래 위치로 되돌아 가고 두 번째'echo'가 실행되어 작업 디렉토리가 인쇄되고 세 번째'make'는 잘못된 디렉토리에서 실행됩니다. – torek

1

why is the M=$(PWD) needed ?

합니다. 이 대상은 차례로 obj-m 변수에있는 모듈 목록 을 참조합니다.

What is obj-m ?

할당은 위의 오브젝트 파일 hello.o에서 빌드 할 하나 개의 모듈이 있음을 주장한다. 결과 모듈은 오브젝트 파일에서 빌드 된 후 hello.ko라는 이름을 갖습니다.

+0

감사합니다 vinay hunachyal – Angus

관련 문제