我正在尝试为显示器编写内核模块,但我正在努力学习基础知识。 如果我尝试分离源文件并通过-objs在Makefile中定义它,内核模块会被编译,加载,但不会做任何事情。
代码:
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为空。
任何方向,我做错了什么?
答案 0 :(得分:2)
我怀疑第一条规则(obj-m:= driver.o)尝试直接使用driver.c。加载模块时,无法找到init_display,模块加载失败。
尝试重命名驱动程序名称,以使Makefile看起来像:
obj-m := mydriver.o
mydriver-y := driver.o display.o