LINUX.ORG.RU

Модули ядра

 , , ,


0

1

Здравствуй ЛОР-чик. Решил попробовать себя в написании модулей ядра по книжке: https://tldp.org/LDP/lkmpg/2.4/lkmpg.pdf.
Первый же пример привёл к невозможности скомпилировать модуль выводящий «хеллоу ворлд». Гугл выдал, что нужны linux-headers, но не userspace, а находящиеся в /usr/src/linux-headers/'uname-r'/... У себя таких не обнаружил, хотя стоит и ядро, и пакет headers соответствующей версии.

стоит

Но не там, куда ванильное ведро с kernel.org в LFS ставится, а куда его дебиановские мейнтейнеры засунули?

bedian

Сами спросили — сами ответили ;)

mertvoprog
()
Ответ на: комментарий от izzholtik

Этого файла не было, так как пакман сурцы кидает не туда. Я распаковал из /var/cahce/pacman/ пакет и перенёс. После этого стали определятся ядрёные функции, вроде printk, но теперь говорит от отсутствии файла «asm/include.h»

BLIN4IK97
() автор топика
Ответ на: комментарий от izzholtik

Это юзерспейсные хедеры, а нужны сурцы

BLIN4IK97
() автор топика
Ответ на: комментарий от MOPKOBKA

Хз, тот же apt, в debian-based, кладёт сурца ядер и хедеров в /usr/src. У меня же по дефолту там пусто…

BLIN4IK97
() автор топика

Если ты пытаешься писать модуля ядра, то наверняка умеешь хотя бы просто собирать просто ядро. Вот тебе совет - а вот возьми и собери свое ядро, и дальше свой модуль в него грузи выгружай через rmmod insmod

Зачем тебе страдания, когда можно четко взять чуть ли не с kernel.org и радоваться?

Недавно страдал из за проблем с пакетами ядра в одном дистре на платформе Байкал-Т1, потом плюнул собрал своё ядро через SDK и бед не знал. Собери своё ядро, это гарантированное решение проблемы

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от Binkledum

Их тупо нет, манджаро какие-то не те хедеры грузит. А все гайды по debian-based системам делались.

BLIN4IK97
() автор топика
Ответ на: комментарий от I-Love-Microsoft

С него же не обязательно загружаться? Я его собираю и дальше просто модуль компилирую с указанием той директории?

BLIN4IK97
() автор топика
Ответ на: комментарий от BLIN4IK97

Ну и? А код где? Код модуля и Makefile. Только на этот раз сфоткай монитор с текстом на телефон, вставь в docx и выложи в облако.мейл.ру.

Binkledum
()
Ответ на: комментарий от Binkledum

Makefile:

 obj-m := hw.o
 
 default:
   ${MAKE} -C /home/andrey/4TB-2/Kenrel/linux-5.10.8/ SUBDIRS=$(shell pwd) modules
 
 clean:
   ${MAKE} -C /home/andrey/4TB-2/Kenrel/linux-5.10.8/ SUBDIRS=$(shell pwd) clean

hw.c:

 /* hw.c − The simplest kernel module */
 
 /* Kernel Programming */
 #define MODULE
 #define LINUX
 #define __KERNEL__
 
 #include <linux/module.h> /* Needed by all modules       */
 #include <linux/kernel.h> /* Needed for KERN_ALERT       */
 
 int init_module( void )
 {
   printk("<1>Hello world 1.\n");
   // A non 0 return means init_module failed; module can't be loaded.
   return 0;
 }
 
 void cleanup_module( void )
 {
   printk(KERN_ALERT "Goodbye world 1.\n");
 }
 
 MODULE_LICENSE("GPL");
BLIN4IK97
() автор топика
Последнее исправление: BLIN4IK97 (всего исправлений: 1)
Ответ на: комментарий от BLIN4IK97

Мне лень проверять в полпервого ночи. Но сама идея вызова make из makefile выглядит по-идиотски. Судя по твоей картинке объектник он даже не пытается собрать. В ядре довольно специфичный синтаксис мейкфайлов и всякую чушь туда не стоит пихать вслепую.

Binkledum
()
Ответ на: комментарий от Binkledum

Я брал мейкфайл из стандартных примеров с таким же кодом модуля. У всех работает, а лично у меня - нет.

BLIN4IK97
() автор топика
Ответ на: комментарий от BLIN4IK97

А почему бы и не загрузиться, ведь модуль можно стартовать только на работающем ядре

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от BLIN4IK97

Тебе проще прописать свой модуль в каком нибудь makefile и Kconfig и собирать в составе ядра, потому что собирать off-tree иногда бывает немного сложновато

Начни с такого варианта, просто прикинься одним из множества драйверов ядра Linux, для этого поправь makefilfe и kconfig в подкаталоге drivers и далее

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от BLIN4IK97

IMHO в hw.c отсутствует пара строк без которых оно не будет модулем.

Если в той доке ничего не сказано про module_init()/module_exit(), то выкини ее.

vel ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Очень интересно, но ничего не понял.

BLIN4IK97
() автор топика

Заголовки лежат в /lib/modules/$(uname -r)/build. Это симлинк, который уже указывает в нужное место.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Те выдают кучу ошибок или их нет вообще

BLIN4IK97
() автор топика
Ответ на: комментарий от BLIN4IK97
[del@del-debian hw]$ sudo insmod -f ./hw.ko # здесь нужен -f, тк в текущем виде не генерится symbol version
[del@del-debian hw]$ sudo rmmod ./hw.ko
[del@del-debian hw]$ dmesg |tail
[323737.085385] <1>Hello world 1.
[323744.450247] Goodbye world 1.

$ cat Makefile 
obj-m := hw.o

Собирал так:

  • В /usr/src/linux-source-5.10 положил текущий конфиг
  • Там же сделал make oldconfig && make prepare
  • Потом
make -C /usr/src/linux-source-5.10/ M=$PWD

Здесь зафейлился линкер (запускался с ключом -T и пустым аргументом), хз, где косяк, стало лень разбираться, запустил руками:

ld -r -m elf_x86_64 --build-id=sha1  -o /home/del/test/module/hw/hw.ko /home/del/test/module/hw/hw.o /home/del/test/module/hw/hw.mod.o
Binkledum
()
Ответ на: комментарий от BLIN4IK97
$ ls /boot/config-`uname -r`
/boot/config-5.10.0-1-amd64

А ещё (если это в ядре включено), то он может лежать в /proc/config.gz (debian эту опцию не включает).

Binkledum
()
Ответ на: комментарий от Binkledum

Без обид, но судя по дате регистрации, тебе не привыкать) О,идея - конвертни видео с использованием libcaca, за буковки точно не забанят)

d09
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.