Сборка модуля ядра (Ubuntu/Debian)

Вопросы программного кода и архитектуры Linux

Модератор: Olej

xaker1
Активист
Сообщения: 10
Зарегистрирован: 28 июн 2013, 11:45
Контактная информация:

Сборка модуля ядра (Ubuntu/Debian)

Непрочитанное сообщение xaker1 » 28 июн 2013, 11:54

Здравствуйте.
Возникла задача - добавить символьное устройство.
Насколько я понял, это реализуется через модуль ядра. Но какие примеры модулей ядра не пытался скомпилировать - ничего не удается.
Последня ошибка:

Код: Выделить всё

xaker1@ubuntu:~/pulse_counter/modules$ make
make -C /lib/modules/3.2.0-41-generic-pae/build  M=/home/xaker1/pulse_counter/modules  modules
make[1]: Entering directory `/usr/src/linux-headers-3.2.0-41-generic-pae'
scripts/Makefile.build:310: target `/home/xaker1/pulse_counter/modules/md1' doesn't match the target pattern
scripts/Makefile.build:310: target `/home/xaker1/pulse_counter/modules/md2' doesn't match the target pattern
scripts/Makefile.build:310: target `/home/xaker1/pulse_counter/modules/md3' doesn't match the target pattern
  CC [M]  /home/xaker1/pulse_counter/modules/md1
gcc: fatal error: no input files
compilation terminated.
make[2]: *** [/home/xaker1/pulse_counter/modules/md1] Error 4
make[1]: *** [_module_/home/xaker1/pulse_counter/modules] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-3.2.0-41-generic-pae'
make: *** [default] Error 2
Использован первый пример из книгиРазработка модулей ядра Linux: Часть 1. Первые шаги.

Код: Выделить всё

$ uname -a
Linux ubuntu 3.2.0-41-generic-pae #66-Ubuntu SMP Thu Apr 25 03:50:20 UTC 2013 i686 athlon i386 GNU/Linux

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Сборка модуля ядра

Непрочитанное сообщение Olej » 28 июн 2013, 15:02

xaker1 писал(а): Возникла задача - добавить символьное устройство.
Насколько я понял, это реализуется через модуль ядра. Но какие примеры модулей ядра не пытался скомпилировать - ничего не удается.
Последня ошибка:

Код: Выделить всё

xaker1@ubuntu:~/pulse_counter/modules$ make
make -C /lib/modules/3.2.0-41-generic-pae/build  M=/home/xaker1/pulse_counter/modules  modules
make[1]: Entering directory `/usr/src/linux-headers-3.2.0-41-generic-pae'
scripts/Makefile.build:310: target `/home/xaker1/pulse_counter/modules/md1' doesn't match the target pattern
scripts/Makefile.build:310: target `/home/xaker1/pulse_counter/modules/md2' doesn't match the target pattern
scripts/Makefile.build:310: target `/home/xaker1/pulse_counter/modules/md3' doesn't match the target pattern
  CC [M]  /home/xaker1/pulse_counter/modules/md1
gcc: fatal error: no input files
У вас странная ошибка: "no input files" - нечего компилировать. (?)
Чего-то у вас не хватает...

Покажите что у вас:
1. содержимое Makefile
2. "ls -l" каталога из которого делаете сборку
3. что у вас инсталлировано дополнительно из пакетов kernel-* (kernel-headers, kernel-develop etc.)?
4.

Код: Выделить всё

bash-4.2$ ls -l /lib/modules/`uname -r`/b*
lrwxrwxrwx. 1 root root 38 авг.  17  2012 /lib/modules/3.5.2-1.fc17.i686.PAE/build -> /usr/src/kernels/3.5.2-1.fc17.i686.PAE

Код: Выделить всё

bash-4.2$ ls /lib/modules/`uname -r`/build
arch	drivers   include  Kconfig  Makefile	    net      security	 tools	vmlinux.id
block	firmware  init	   kernel   mm		    samples  sound	 usr
crypto	fs	  ipc	   lib	    Module.symvers  scripts  System.map  virt
xaker1 писал(а):

Код: Выделить всё

$ uname -a
Linux ubuntu 3.2.0-41-generic-pae #66-Ubuntu SMP Thu Apr 25 03:50:20 UTC 2013 i686 athlon i386 GNU/Linux
Я так понимаю, что у вас дистрибутив Ubuntu? Какой?
(в принципе, все примеры из цикла статей, которые вы называете - проверены на сборку и работоспособность в Ubuntu 10.04 ... не думаю, чтобы с изменением версии Ubuntu до 12.* что-то существенно изменилось)

xaker1
Активист
Сообщения: 10
Зарегистрирован: 28 июн 2013, 11:45
Контактная информация:

Re: Сборка модуля ядра

Непрочитанное сообщение xaker1 » 28 июн 2013, 16:45

Olej писал(а): У вас странная ошибка: "no input files" - нечего компилировать. (?)
Чего-то у вас не хватает...

Покажите что у вас:
1. содержимое Makefile
2. "ls -l" каталога из которого делаете сборку
3. что у вас инсталлировано дополнительно из пакетов kernel-* (kernel-headers, kernel-develop etc.)?
4.

Код: Выделить всё

bash-4.2$ ls -l /lib/modules/`uname -r`/b*
lrwxrwxrwx. 1 root root 38 авг.  17  2012 /lib/modules/3.5.2-1.fc17.i686.PAE/build -> /usr/src/kernels/3.5.2-1.fc17.i686.PAE

Код: Выделить всё

bash-4.2$ ls /lib/modules/`uname -r`/build
arch	drivers   include  Kconfig  Makefile	    net      security	 tools	vmlinux.id
block	firmware  init	   kernel   mm		    samples  sound	 usr
crypto	fs	  ipc	   lib	    Module.symvers  scripts  System.map  virt
xaker1 писал(а):

Код: Выделить всё

$ uname -a
Linux ubuntu 3.2.0-41-generic-pae #66-Ubuntu SMP Thu Apr 25 03:50:20 UTC 2013 i686 athlon i386 GNU/Linux
Я так понимаю, что у вас дистрибутив Ubuntu? Какой?
(в принципе, все примеры из цикла статей, которые вы называете - проверены на сборку и работоспособность в Ubuntu 10.04 ... не думаю, чтобы с изменением версии Ubuntu до 12.* что-то существенно изменилось)
xaker1@ubuntu:~/pulse_counter/modules$ ls -la
total 28
drwxrwxr-x 3 xaker1 xaker1 4096 Jun 28 12:39 .
drwxrwxr-x 4 xaker1 xaker1 4096 Jun 27 23:19 ..
-rw-rw-r-- 1 xaker1 xaker1 427 Jun 28 12:36 Makefile
-rw-rw-r-- 1 xaker1 xaker1 636 Jun 28 12:34 md1.c
-rw-rw-r-- 1 xaker1 xaker1 507 Jun 28 12:35 md2.c
-rw-rw-r-- 1 xaker1 xaker1 56 Jun 28 12:35 md.h
drwxrwxr-x 2 xaker1 xaker1 4096 Jun 27 23:20 .tmp_versions
xaker1@ubuntu:~/pulse_counter/modules$ cat Makefile
#CURRENT = $(shell uname -r)
CURRENT = 3.2.0-41-generic-pae
KDIR = /lib/modules/$(CURRENT)/build
PWD = $(shell pwd)
TARGET1 = md1
TARGET2 = md2
TARGET3 = md3
obj-m := $(TARGET1).o $(TARGET2).o $(TARGET3).o
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
@rm -f *.o .*.cmd .*.flags *.mod.c *.order
@rm -f .*.*.cmd *~ *.*~ TODO.*
@rm -fR .tmp*
@rm -rf .tmp_versions
disclean: clean
@rm *.ko *.symvers
xaker1@ubuntu:~/pulse_counter/modules$ cat md1.c
#include <linux/init.h>
#include <linux/module.h>
#include "md.h"
MODULE_LICENSE( "GPL" );
MODULE_AUTHOR( "Oleg Tsiliuric <olej@front.ru>" );
char* md1_data = "ц╟ц┘ ц█ц▓";
extern char* md1_proc( void ) {
return md1_data;
}
static char* md1_local( void ) {
return md1_data;
}
extern char* md1_noexport( void ) {
return md1_data;
}
EXPORT_SYMBOL( md1_data );
EXPORT_SYMBOL( md1_proc );
static int __init md_init( void ) {
printk( "+ module md1 start!\n" );
return 0;
}
static void __exit md_exit( void ) {
printk( "+ module md1 unloaded!\n" );
}
module_init( md_init );
module_exit( md_exit );
xaker1@ubuntu:~/pulse_counter/modules$ cat md2.c
#include <linux/init.h>
#include <linux/module.h>
#include "md.h"
MODULE_LICENSE( "GPL" );
MODULE_AUTHOR( "Oleg Tsiliuric <olej@front.ru>" );
static int __init md_init( void ) {
printk( "+ module md2 start!\n" );
printk( "+ data string exported from md1 : %s\n", md1_data );
printk( "+ string returned md1_proc() is : %s\n", md1_proc() );
return 0;
}
static void __exit md_exit( void ) {
printk( "+ module md2 unloaded!\n" );
}
module_init( md_init );
module_exit( md_exit );
xaker1@ubuntu:~/pulse_counter/modules$ cat md.h
extern char* md1_data;
extern char* md1_proc( void );
xaker1@ubuntu:~/pulse_counter/modules$ cat /etc/debian_version
wheezy/sid
xaker1@ubuntu:~/pulse_counter/modules$ dpkg -l | grep linux
ii libselinux1 2.1.0-4.1ubuntu1 SELinux runtime shared libraries
ii linux-firmware 1.79.4 Firmware for Linux kernel drivers
ii linux-generic-pae 3.2.0.41.49 Complete Generic Linux kernel
ii linux-headers-3.2.0-41 3.2.0-41.66 Header files related to Linux kernel version 3.2.0
ii linux-headers-3.2.0-41-generic-pae 3.2.0-41.66 Linux kernel headers for version 3.2.0 on 32 bit x86 SMP
ii linux-headers-generic-pae 3.2.0.41.49 Generic Linux kernel headers
ii linux-image-3.2.0-41-generic-pae 3.2.0-41.66 Linux kernel image for version 3.2.0 on 32 bit x86 SMP
ii linux-image-generic-pae 3.2.0.41.49 Generic Linux kernel image
ii linux-libc-dev 3.2.0-48.74 Linux Kernel Headers for development
ii util-linux 2.20.1-1ubuntu3 Miscellaneous system utilities
xaker1@ubuntu:~/pulse_counter/modules$ ls -l /lib/modules/`uname -r`/b*
lrwxrwxrwx 1 root root 43 Apr 25 09:05 /lib/modules/3.2.0-41-generic-pae/build -> /usr/src/linux-headers-3.2.0-41-generic-pae
xaker1@ubuntu:~/pulse_counter/modules$ ls /lib/modules/`uname -r`/build
arch block crypto Documentation drivers firmware fs include init ipc Kbuild Kconfig kernel lib Makefile mm Module.symvers net samples scripts security sound tools ubuntu usr virt
Список пакетов, доступных для установки: (kernel-*)
xaker1@ubuntu:~/pulse_counter/modules$ apt-cache search kernel| grep ^kernel
kernel-wedge - udeb package builder for Debian-Installer
kerneloops-daemon - kernel oops tracker
kernel-package - A utility for building Linux kernel related Debian packages.
kernel-patch-scripts - Scripts to help dealing with packaged kernel patches
kernel-patch-wrr - Extension to traffic Control/network bandwidth management
kerneloops - kernel oops tracker
kerneloops-applet - applet for the kernel oops tracker
kernelshark - Utilities for graphically analyzing function tracing in the kernel
kerneltop - shows linux kernel function usage in a style like top

xaker1
Активист
Сообщения: 10
Зарегистрирован: 28 июн 2013, 11:45
Контактная информация:

Re: Сборка модуля ядра

Непрочитанное сообщение xaker1 » 28 июн 2013, 21:35

p.s. И вообще, как можно поменять компилятор в Makefile?
Интересует как g++, так и кросскомпилятор.

p.p.s. Где-то прочитал, что в модуле ядра нельзя использовать сокеты. Так ли это? И как в таком случае можно реализовать обмен данными между демоном и модулем ядра.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Сборка модуля ядра

Непрочитанное сообщение Olej » 28 июн 2013, 21:54

xaker1 писал(а):p.s. И вообще, как можно поменять компилятор в Makefile?
Интересует как g++, так и кросскомпилятор.
1. практически никак (хотя есть сообщения о сборке ядра компилятором Clang)
2. зачем?
g++ реализует свои заморочки C++ за счёт библиотек *.so, в ядре библиотеки недоступны ... в чём смысл?
xaker1 писал(а):p.p.s. Где-то прочитал, что в модуле ядра нельзя использовать сокеты. Так ли это? И как в таком случае можно реализовать обмен данными между демоном и модулем ядра.
Сокеты из стандартной библиотеки? ... да, нельзя.
Но нужно смотреть что там есть из API ядра.
И зачем из ядра "обмен данными между демоном и модулем ядра"(с)? ... не царское это дело ;-)

xaker1
Активист
Сообщения: 10
Зарегистрирован: 28 июн 2013, 11:45
Контактная информация:

Re: Сборка модуля ядра

Непрочитанное сообщение xaker1 » 28 июн 2013, 22:03

Olej писал(а):1. практически никак (хотя есть сообщения о сборке ядра компилятором Clang)
2. зачем?
g++ реализует свои заморочки C++ за счёт библиотек *.so, в ядре библиотеки недоступны ... в чём смысл?
1) нужно собрать модуль под arm платформу. Или... без разницы? Модуль собранный на i386 будет работать на arm?
xaker1 писал(а):p.p.s. Где-то прочитал, что в модуле ядра нельзя использовать сокеты. Так ли это? И как в таком случае можно реализовать обмен данными между демоном и модулем ядра.
Сокеты из стандартной библиотеки? ... да, нельзя.
Но нужно смотреть что там есть из API ядра.
И зачем из ядра "обмен данными между демоном и модулем ядра"(с)? ... не царское это дело ;-)
Впринципе можно попробовать и в модуль все запихнуть... Если коротко - то программа по своим алгоритмам высчитывает число X и нужно предоставить возможность чтения\изменения X через символьное устройство.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Сборка модуля ядра

Непрочитанное сообщение Olej » 28 июн 2013, 22:16

xaker1 писал(а):
Olej писал(а):1. практически никак (хотя есть сообщения о сборке ядра компилятором Clang)
2. зачем?
g++ реализует свои заморочки C++ за счёт библиотек *.so, в ядре библиотеки недоступны ... в чём смысл?
1) нужно собрать модуль под arm платформу. Или... без разницы? Модуль собранный на i386 будет работать на arm?
Если модуль собирается на ARM, то он и будет для ARM.
Если он собирается на другой платформе (x86), то здесь нужна кросс-компляция, нужно с опциями смотреть в документации.
xaker1 писал(а):
Olej писал(а): Сокеты из стандартной библиотеки? ... да, нельзя.
Но нужно смотреть что там есть из API ядра.
И зачем из ядра "обмен данными между демоном и модулем ядра"(с)? ... не царское это дело ;-)
Впринципе можно попробовать и в модуль все запихнуть... Если коротко - то программа по своим алгоритмам высчитывает число X и нужно предоставить возможность чтения\изменения X через символьное устройство.
Может и можно, но - не нужно.
В ядро (в модуль) следует "запихать" только то, что в пользовательском пространстве сделать нельзя. Всё остальное делается в пользовательском пространстве (процессы, демоны, службы, ...).

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Сборка модуля ядра (Ubuntu/Debian)

Непрочитанное сообщение Olej » 28 июн 2013, 22:20

xaker1 писал(а): 1) нужно собрать модуль под arm платформу. Или... без разницы? Модуль собранный на i386 будет работать на arm?
См. здесь о сборке под ARM: Linux для embedded применений

xaker1
Активист
Сообщения: 10
Зарегистрирован: 28 июн 2013, 11:45
Контактная информация:

Re: Сборка модуля ядра (Ubuntu/Debian)

Непрочитанное сообщение xaker1 » 28 июн 2013, 22:41

Olej писал(а):
xaker1 писал(а): 1) нужно собрать модуль под arm платформу. Или... без разницы? Модуль собранный на i386 будет работать на arm?
См. здесь о сборке под ARM: Linux для embedded применений
Пробежался, но про модули ничего не заметил. А кросскомпиляцией и так занимаюсь)))

p.s. Искреннее уважение вам, за такие заметки)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Сборка модуля ядра (Ubuntu/Debian)

Непрочитанное сообщение Olej » 29 июн 2013, 13:07

xaker1 писал(а):
Olej писал(а):
xaker1 писал(а): 1) нужно собрать модуль под arm платформу. Или... без разницы? Модуль собранный на i386 будет работать на arm?
См. здесь о сборке под ARM: Linux для embedded применений
Пробежался, но про модули ничего не заметил.
А зачем там про модули? ;-)
Там подробно про инструментальные средства компиляции ПО под ARM, выполняемую на стандартном x86. А далее в этом инструментарии можно компилировать и собирать хоть ядро, хоть утилиты-окружение, хоть модули, хоть пользовательские приложения...
xaker1 писал(а):Использован первый пример из книгиРазработка модулей ядра Linux: Часть 1. Первые шаги.

Код: Выделить всё

$ uname -a
Linux ubuntu 3.2.0-41-generic-pae #66-Ubuntu SMP Thu Apr 25 03:50:20 UTC 2013 i686 athlon i386 GNU/Linux
Вообще довольно странно... сборкой вы занимаетесь в Ubuntu... Ubuntu под ARM? ;-)
xaker1 писал(а):Если коротко - то программа по своим алгоритмам высчитывает число X и нужно предоставить возможность чтения\изменения X через символьное устройство.
Про драйвера символьных устройств нужно не в 1-й статье цикла смотреть (там цикл из 62-ти статей на сегодня ... с продолжением ;-) , и ещё будет).,
Там дальше очень подробно есть про самые разные варианты символьных устройств...
Вот здесь, начиная с 18-й статьи цикла и по 25-ю. Там много, есть что почитать ;-) ... и про ваше число Х в символьном устройстве там найдёте ;-)

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость