添加其他对象后未加载内核模块

时间:2019-01-22 18:29:53

标签: linux kernel driver

结论

当只为一个驱动程序模块编译一个文件时,一切正常。 如果将.c / .h模块添加到先前的文件中,它将再次编译。 但是我无法将模块加载到内核中。

详细信息

我正在通过Ubunto LTS 18.04主机系统上的ssh开发RPi3B +。 目前,我没有使用任何交叉工具,而是直接在RPi上构建。

我正在开发内核模块。 现在,我的模块增加了,我想将其分成不同的.h / .c模块。

首先,我实现了《嵌入式Linux,rernen mit dem Raspberry Pi》一书中的示例。但是它是德语的。

一切正常,直到我将其他目标文件添加到Makefile中为止。在此之前,我可以加载和卸载模块,并且可以看到每个输出形式“ printk()”。我也可以再次复制它!

但是,如果我使用其他文件进行编译,则一切正常,没有错误也没有警告。但是,如果我尝试使用“ insmod”加载新模块。 内核对“ dmesg”没有响应。 / dev /下没有新设备 但是“ lsmod”知道这一点!

如果要在驱动程序模块中添加几个.c / .h文件,有什么特别的地方吗?

Makefile

ifneq ($(KERNELRELEASE),)
obj-m := kernel_nfc_module.o
kernel_nfc_module-objs := kernel_gpio.o

else
KDIR := /lib/modules/$(shell uname -r)/build
PWD  := $(shell pwd)

default:
        $(MAKE)  -Wall -C $(KDIR) M=$(PWD) modules 
endif

clean:
        rm -rf *.ko *.o .*.cmd .tmp_versions Module.symvers
        rm -rf modules.order *.mod.c

kernel_gpio.h

#ifndef KERNEL_GPIO_H
#define KERNEL_GPIO_H
MODULE_LICENSE("GPL");

void sayHello(void);

#endif // KERNEL_GPIO_H

kernel_gpio.c

#include <linux/module.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/gpio.h>
#include <linux/uaccess.h>

#include <linux/string.h>
#include "kernel_gpio.h"
#include "kernel_utils.h"

void sayHello(void)
{
        printk("Hello Module");
}

MODULE_LICENSE("GPL");

我完全感到困惑,因为o没有收到来自编译器或insmod的错误。 我想知道如何使用其他.c / .h文件来编译内核模块。

感谢您的建议。

1 个答案:

答案 0 :(得分:0)

感谢Tsyvarev的有用评论,我得以解决我的问题。

解决方案

我有以下文件:

  • kernel_nfc_module.c
  • kernel_gpio.c
  • kernel_gpio.h

Makefile

我必须为两个来源的组合目标文件添加一个新名称!

ifneq ($(KERNELRELEASE),)
obj-m := nfc_module.o
nfc_module-objs := kernel_nfc_module.o kernel_gpio.o

else
KDIR := /lib/modules/$(shell uname -r)/build
PWD  := $(shell pwd)

default:
        $(MAKE)  -Wall -C $(KDIR) M=$(PWD) modules 
endif

clean:
        rm -rf *.ko *.o .*.cmd .tmp_versions Module.symvers
        rm -rf modules.order *.mod.c