Модуль ядра не загружается после добавления дополнительных объектов - PullRequest
0 голосов
/ 22 января 2019

Заключение

При компиляции только одного файла для модуля драйвера все работает. Если я добавлю модуль .c / .h к предыдущему файлу, он снова скомпилируется. Но я не могу загрузить модуль в ядро.

Подробнее

Я работаю над RPi3B + over ssh из моей системы Ubunto LTS 18.04 Host. В настоящее время я не использую кросс-инструменты, а собираю прямо на RPi.

Я разрабатываю ядро ​​moudle. Теперь, когда мой модуль увеличился в размере, я бы хотел разделить его на разные модули .h / .c.

Для начала я реализовал пример из книги «Встроенный Linux, lernen 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");

Я полностью сбит с толку, потому что я не получаю ошибок от компилятора или insmod. Я хотел бы знать, как скомпилировать модуль ядра с дополнительными файлами .c / .h.

Спасибо за ваш совет.

1 Ответ

0 голосов
/ 23 января 2019

Благодаря полезному комментарию от Цыварева я смог решить мою проблему.

Решение

У меня были следующие файлы:

  • 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
...