0

我正在尝试为显示器编写一个内核模块,但我正在努力学习基础知识。如果我尝试分离源文件并通过 -objs 在 Makefile 中定义它,内核模块将被编译、加载,但不执行任何操作。

代码:

驱动程序.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");
}

显示.h

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

显示.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(加载、卸载)输出,内核日志是空的。

任何方向,我做错了什么?

4

1 回答 1

2

我怀疑第一条规则(obj-m := driver.o)试图直接使用 driver.c。当您加载模块时 init_display 找不到并且模块加载失败。

尝试重命名您的驱动程序名称,使您的 Makefile 看起来像:

obj-m := mydriver.o
mydriver-y := driver.o display.o
于 2013-11-13T10:06:31.150 回答