디스플레이 용 커널 모듈을 작성하려고하는데 기본 사항에 어려움을 겪고 있습니다. 소스 파일을 분리하여 -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가 비어 있습니다.
길 찾기, 내가 잘못하고있는 것?
당신이 정말로 모두'OBJ-m'에서'driver.o'와'드라이버 objs'을하려는 마십시오 당신의 메이크처럼 보이도록
는 드라이버 이름을 이름을 변경하려고? 그 중 하나가 하위 디렉토리 나 다른 것으로 끝나지 않는다면 문제가 발생할 수 있다고 생각합니다. – twalberg또한 driver-objs 대신 구문 driver-y를 사용해보십시오. 그것이 https://www.kernel.org/doc/Documentation/kbuild/modules.txt에 문서화되어 있습니다. – Peter
입력 해 주셔서 감사합니다! 안타깝게도 driver-obj에서 driver.o를 제거하거나 driver-y를 사용하여 (그리고 결합하여) 문제를 수정하지 마십시오 – Henrik