首页 文章

Makefile中的objs会破坏内核模块

提问于
浏览
0

我正在尝试为显示器编写内核模块,但我正在努力学习基础知识 . 如果我尝试分离源文件并通过-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");
}

Makefile文件

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 回答

  • 2

    我怀疑第一个规则(obj-m:= driver.o)尝试直接使用driver.c . 加载模块时,无法找到init_display,模块加载失败 .

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

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

相关问题