поиск заголовочных файлов для простого драйвера устройства в Fedora 20 - PullRequest
0 голосов
/ 09 мая 2018

Итак, я попытался следовать простым примерам для загрузки драйвера устройства «Hello World», описанного в руководстве по драйверам устройств O'Rielly Linux. Проблема в том, что по какой-то причине он не будет работать, если я не укажу явно путь к моим заголовочным файлам в операторах включения; то есть я должен набрать #include </usr/src/kernels/3.19.8-100.fc20.i686+PAE/include/linux/init.h> вместо #include </linux/init.h>

вот мой make-файл

obj-m := hello.o
KDIR =/usr/src/kernels/3.19.8-100.fc20.i686+PAE/include
all:
    make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
clean:
    make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean

и возвращает ошибку «не удается найти» во всех заголовочных файлах, если явно не определено как #include </usr/src/kernels/3.19.8-100.fc20.i686+PAE/include/linux/init.h>, что я бы предпочел не делать.

Спасибо за вашу помощь.

В случае, если это кому-нибудь поможет, если я оставлю в явном выражении include и затем скомпилирую, файл hello.mod.c, который будет получен, выглядит следующим образом.

#include <linux/module.h>
#include <linux/vermagic.h>
#include <linux/compiler.h>

MODULE_INFO(vermagic, VERMAGIC_STRING);

__visible struct module __this_module
__attribute__((section(".gnu.linkonce.this_module"))) = {
    .name = KBUILD_MODNAME,
    .init = init_module,
#ifdef CONFIG_MODULE_UNLOAD
    .exit = cleanup_module,
#endif
    .arch = MODULE_ARCH_INIT,
};

static const char __module_depends[]
__used
__attribute__((section(".modinfo"))) =
"depends=";

Это нормально загружается с помощью insmod.

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

KDIR = / usr / src / kernels / 3.19.8-100.fc20.i686 + PAE / include

Я думаю, что ваша "линия KDIR" неверна ....Этот Makefile работает (обычно):

obj-m    := hello.o
KDIR    := /lib/modules/$(shell uname -r)/build
PWD    := $(shell pwd)
default:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
    $(MAKE) -C $(KDIR) M=$(PWD) clean

Предположим, # dnf install kernel kernel-devel → Т.е. kernel-devel должно быть точным совпадением для kernel.

Примечание :/ lib / modules / [версия] / { build } / - это ссылка на /usr/src/kernels/[version]/, , а не на / usr / src / kernels / [версия] / include / .... Ссылка создается при установке kernel-devel

0 голосов
/ 09 мая 2018

Я нашел ответ. Спасибо YSC, который указал мне правильный путь. Мне просто нужно было сделать несколько дополнительных вещей, найденных здесь Где GCC ищет свои заголовочные файлы?

По сути, мне нужно было добавить каталог include в путь включения заголовка gcc. Я сделал это, набрав cpp -I <desired path> -v, что для меня было /usr/src/kernels/.......etc.

работает только cpp -v дал мне список путей поиска, которые ищет gcc. просто убедитесь, что он там.

так что теперь мои модули драйверов собираются правильно и загружаются с операторами включения как #include <linux/init.h>, как я и хотел.

0 голосов
/ 09 мая 2018

Ваш компилятор должен иметь возможность указать путь поиска включаемых файлов. GnuCC (gcc, g++) и CLang (clang, clang++) оба используют -I.

Если ваш заголовочный файл на /usr/src/kernels/3.19.8-100/include/linux/init.h и вы вызываете, скажем g++ с:

g++ -I /usr/src/kernels/3.19.8-100/include/ source.cpp

Тогда source.cpp может #include <linux/init.h>.


Теперь вам нужно научиться предоставлять эту опцию командной строки вашему компилятору через make-файлы ОС для сборки модулей. Это задокументировано в нескольких местах, но обычно определяется переменная окружения CPPFLAGS, содержащая дополнительные параметры:

$ export CPPFLAGS="-I /usr/src/kernels/3.19.8-100/include/"
$ make
...