Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Не получается создать “простейший” драйвер в Ubuntu

#linux #c #драйвер


Не получается создать драйвер в Ubuntu (железный бобёр).

Makefile

# Makefile – makefile of our first driver

# if KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq (${KERNELRELEASE},)
    obj-m := ofd.o
# Otherwise we were called directly from the command line.
# Invoke the kernel build system.
else
    KERNEL_SOURCE := /lib/modules/4.15.0-47-generic/
    PWD := $(shell pwd)
default:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules

clean:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} clean
endif


ofd.c
    /* ofd.c - Код нашего первого драйвера */
    #include 
    #include 
    #include 

static int __init ofd_init(void) /* Конструктор */
{
    printk(KERN_INFO "dimon ^_^ : ofd registered");
    return 0;
}

static void __exit ofd_exit(void) /* Деструктор*/
{
    printk(KERN_INFO "pumba ;_; : ofd unregistered");
}

module_init(ofd_init);
module_exit(ofd_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("kaban ");
MODULE_DESCRIPTION("Moi perwii draiwer (Our First Driver)");


Получил такой результат 

Делал всё по статье написание простершего драйвера. не знаю почему несобралося :Р



Поправил и добавил ТАБы.

# Makefile – makefile of our first driver

# if KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq (${KERNELRELEASE},)
    obj-m := ofd.o
# Otherwise we were called directly from the command line.
# Invoke the kernel build system.
else
    KERNEL_SOURCE := /lib/modules/4.15.0-47-generic/
    PWD := $(shell pwd)
default:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules

clean:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} clean
endif


Вот вывод что мне дал компьютер 

comp@comp0:~$ make
make -C /lib/modules/4.15.0-47-generic/ SUBDIRS=/home/comp modules
make[1]: вход в каталог «/lib/modules/4.15.0-47-generic»
make[1]: *** Нет правила для сборки цели «modules».  Останов.
make[1]: выход из каталога «/lib/modules/4.15.0-47-generic»
Makefile:13: recipe for target 'default' failed
make: *** [default] Error 2


Странно,даёт ошибку, хотя ядро я указал верное.

comp@comp0:~$ uname -r 
4.15.0-47-generic

    


Ответы

Ответ 1



в начале строки с рецептом должен стоять символ табуляции. у вас в файле всего две такие строки (обе начинаются с ${MAKE}). проконтролируйте, что в их начале стоит именно символ табуляции, а не пробел. в дополнение: первая из строк, содержащая рецепт, может быть объединена с правилом (см. ссылку выше), через точку с запятой. т.е. вместо: цель: рецепт # здесь в начале строки — символ табуляции можно написать: цель: ; рецепт # здесь только пробелы, которые можно и убрать make -C /lib/modules/4.15.0-47-generic/ SUBDIRS=/home/comp modules make[1]: вход в каталог «/lib/modules/4.15.0-47-generic» make[1]: *** Нет правила для сборки цели «modules». Останов. ну, загляните в каталог, где вы пытаетесь выполнить цель modules: /lib/modules/4.15.0-47-generic/. видите там файл с именем [Mm]akefile или GNUmakefile? думаю, нет. возможно, в этом каталоге есть симлинк с именем build или source (или что-нибудь в этом духе), который указывает на нужный каталог (в котором есть какой-нибудь из перечисленных файлов). вот и попробуйте указать именно этот путь (/lib/modules/4.15.0-47-generic/build/) вместо /lib/modules/4.15.0-47-generic/

Ответ 2



Удалите пробелы - используйте вместо них TAB'ы.

Комментариев нет:

Отправить комментарий