2013-11-12 2 views
0

디스플레이 용 커널 모듈을 작성하려고하는데 기본 사항에 어려움을 겪고 있습니다. 소스 파일을 분리하여 -objs를 통해 Makefile에 정의하려고하면 커널 모듈이 컴파일되고로드되지만 아무 것도하지 않습니다.Makefile의 objs가 커널 모듈을 끊습니다.

코드 :

driver.c

#define LINUX 
#include <linux/module.h> 
#include <linux/kernel.h> 
#include "display.h" 

int init_module(void) { 
    printk(KERN_INFO "module registered\n"); 
    init_display(); 
    return 0; 
} 

void cleanup_module(void) { 
    printk(KERN_INFO "module unregistered\n"); 
} 

display.h

#ifndef DISPLAY_H 
#define DISPLAY_H 
void init_display (void); 
#endif 

display.c

#include "display.h" 
#include <linux/module.h> /* Needed by all modules */ 
#include <linux/kernel.h> /* Needed for KERN_ALERT */ 

void init_display (void) { 
    printk(KERN_INFO "initialize display\n"); 
} 

메이크

obj-m := driver.o 
driver-objs := driver.o display.o 
KDIR := /lib/modules/$(shell uname -r)/build 
PWD := $(shell pwd) 

default: 
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules 
clean: 
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean 

Makefile에 include 및 driver-objs가 없으면 KERN_INFO (로드, 언로드) 출력이 표시되고 kernellog가 비어 있습니다.

길 찾기, 내가 잘못하고있는 것?

+1

당신이 정말로 모두'OBJ-m'에서'driver.o'와'드라이버 objs'을하려는 마십시오 당신의 메이크처럼 보이도록

는 드라이버 이름을 이름을 변경하려고? 그 중 하나가 하위 디렉토리 나 다른 것으로 끝나지 않는다면 문제가 발생할 수 있다고 생각합니다. – twalberg

+0

또한 driver-objs 대신 구문 driver-y를 사용해보십시오. 그것이 https://www.kernel.org/doc/Documentation/kbuild/modules.txt에 문서화되어 있습니다. – Peter

+0

입력 해 주셔서 감사합니다! 안타깝게도 driver-obj에서 driver.o를 제거하거나 driver-y를 사용하여 (그리고 결합하여) 문제를 수정하지 마십시오 – Henrik

답변

2

첫 번째 규칙 (obj-m : = driver.o)이 driver.c를 직접 사용하려고합니다. 모듈을로드 할 때 init_display를 찾을 수 없으며 모듈로드가 실패합니다.

obj-m := mydriver.o 
mydriver-y := driver.o display.o 
+0

Thanks !! 그것이 도움이되는 답변이었습니다! 나는 당신을 upvote 싶지만, stackoverflow에 대한 명성을 놓치고있어 ... – Henrik

+0

그건 괜찮아 Henrik, 우리는 모두 그 단계로 지나가고 있지만 받아들이십시오 ;-) –

+0

@Henrik, 나는 "대답을 수락"을 의미 : 피 –

관련 문제