LINUX.ORG.RU

Добавить патч в работающее ядро

 , ,


0

2

Итак, предыстория. Есть одноплатный компьютер Cubietruck. На нем крутится Cubian (одна из сборок Debian 7). Используется как домашний сервер, настроено и работает куча софта.

Недавно понадобилось подключить ИК-передатчик через GPIO, но нет нужных модулей ядра для работы lirc на отправку через GPIO. В Интрнете эти модули есть в виде двух си-файлов и файла с расширением patch (https://github.com/matzrh/sunxi-lirc). Извиняюсь за нубский вопрос, но можно ли эти файлы (модули) скомпилировать и потом через modprobe (lsmod) засунуть в мое работающее ядро? И как это сделать? Поискал информацию в сети, однако все обрывками. Headers и sources из репозиториев скачал, установил module-assistant, что делать дальше — не знаю.

Я не знаю, как сделать это в духе Debian, но в общем: распакуй исходники ядра Cubian, наложи патч, подкинь файлы в нужные каталоги, сконфигурируй ядро, собери его кросс-компилятором для ARM, и попробуй, загружаются ли они вообще

tailgunner ★★★★★
()

Можно. Но обязательно нужно, чтобы версия запущенного ядра соответствовала версии исходников. После компиляции модулей и депмода копируете модуль .ko в соответствующую директорию /lib/modules/<version>/..., ну либо, как вы и сказали, через insmod (если зависимостей от других модулей нет)

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

Я просто не пойму, как подступиться к сему этому действу. К сожалению, автор https://github.com/matzrh/sunxi-lirc не написал даже краткого how-to, как собрать все это воедино. Раньше мой опыт компилирования для Linux ограничивался использованием готовых make файлов, там все было просто. Здесь же... Я просто не пойму, с чего начать.... Искать способ компиляции этих с-файлов сразу в модули ядра? Нужно ли как-то использовать файл patch? Нужно ли указывать путь к исходникам ядра или ложить эти с-файлы в сами исходники Linux или делать что-либо еще? Просто смотрю на экран, как баран, и не знаю, с чего начать.

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

Вам нужны исходники используемой версии Linux.
После этого есть два пути:

  • наложить указаный patch, скопировать файлы в drivers/staging/media/lirc и далее стандартно через make menuconfig сконфигуровать использвание драйвера
  • второй путь чуть более сложный и требует написание Makefile для сборки драйвера (https://www.google.com/search?q=linux driver makefile)
imb ★★
()

Создай Makefile:

KERNEL = /lib/modules/`uname -r`/build

obj-m := sunxi-lirc.o

all:
	make -C $(KERNEL) M=$(PWD) modules

clean:
	make -C $(KERNEL) M=$(PWD) clean

Если у тебя установлены заголовки ядра, запуск make соберёт .ko модуль.

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

KERNEL = /lib/modules/`uname -r`/build

Частный случай сборки на целевой платформе.

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

/lib/modules/`uname -r`/build не взлетает, посмотрел, а это почему-то символическая ссылка и ссылается в никуда. Поискал по системе, нашел вроде подходящую папку /usr/src/linux-headers-3.4.79-sun7i, создал make-файл:

KERNEL = /usr/src/linux-headers-3.4.79-sun7i

obj-m := sunxi-lirc.o

all:
	make -C $(KERNEL) M=$(PWD) modules

clean:
	make -C $(KERNEL) M=$(PWD) clean
запустил, и такой вывод
make -C /usr/src/linux-headers-3.4.79-sun7i M=/media/Storage/Temp/sunxi-lirc-master modules
make[1]: Entering directory `/usr/src/linux-headers-3.4.79-sun7i'
  CC [M]  /media/Storage/Temp/sunxi-lirc-master/sunxi-lirc.o
In file included from /usr/src/linux-headers-3.4.79-sun7i/arch/arm/include/asm/domain.h:14:0,
                 from /usr/src/linux-headers-3.4.79-sun7i/arch/arm/include/asm/thread_info.h:28,
                 from include/linux/thread_info.h:53,
                 from include/linux/preempt.h:9,
                 from include/linux/spinlock.h:50,
                 from include/linux/seqlock.h:29,
                 from include/linux/time.h:8,
                 from include/linux/stat.h:60,
                 from include/linux/module.h:10,
                 from /media/Storage/Temp/sunxi-lirc-master/sunxi-lirc.c:30:
/usr/src/linux-headers-3.4.79-sun7i/arch/arm/include/asm/barrier.h:41:27: fatal error: mach/barriers.h: Нет такого файла или каталога
compilation terminated.
make[2]: *** [/media/Storage/Temp/sunxi-lirc-master/sunxi-lirc.o] Ошибка 1
make[1]: *** [_module_/media/Storage/Temp/sunxi-lirc-master] Ошибка 2
make[1]: Leaving directory `/usr/src/linux-headers-3.4.79-sun7i'
make: *** [all] Ошибка 2
Хотя сам файл, на который он ссылается, есть:
ls -l /usr/src/linux-headers-3.4.79-sun7i/arch/arm/include/asm/barrier.h 
-rw-r--r-- 1 root root 2398 Фев 19  2014 /usr/src/linux-headers-3.4.79-sun7i/arch/arm/include/asm/barrier.h
Попробовал запустить make через root (думаю, может где права только для rootа). Вывод такой:
make -C /usr/src/linux-headers-3.4.79-sun7i M= modules
make[1]: Entering directory `/usr/src/linux-headers-3.4.79-sun7i'
  CHK     include/linux/version.h
  CHK     include/generated/utsrelease.h
  HOSTCC  scripts/basic/fixdep
make[2]: *** Нет правила для сборки цели `arch/arm/tools/gen-mach-types', требуемой для `include/generated/mach-types.h'.  Останов.
make[1]: *** [archprepare] Ошибка 2
make[1]: Leaving directory `/usr/src/linux-headers-3.4.79-sun7i'
make: *** [all] Ошибка 2
Куда копать дальше?

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

Хотя сам файл, на который он ссылается, есть:

Это asm/barrier.h ссылается на mach/barriers.h, которого нет. Либо что-то не так с заголовками ядра, либо просто код модуля кривой.

Куда копать дальше?

Без понятия. Попробуй поискать пакет, который содержит цель битой ссылки build. В Debian заголовки ядра разделены на два пакета, может и здесь так же.

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

Это asm/barrier.h ссылается на mach/barriers.h, которого нет. Либо что-то не так с заголовками ядра, либо просто код модуля кривой.

Обычно такая ситуация возникает если Linux не собран, таким образом прежде чем собирать модуль необходимо собрать Linux.

imb ★★
()

В общем, пакет с заголовками оказался битый, автор дистрибутива рекомендует использовать сами исходники. Сделал ссылку в Makefile на исходники, теперь make другое пишет, но в целевой директории появляется файл sunxi-lirc.o:

make[1]: Entering directory `/media/Storage/Temp/CubianSources/DebSource/linux-source-3.4.79-sun7i'

  WARNING: Symbol version dump /media/Storage/Temp/CubianSources/DebSource/linux-source-3.4.79-sun7i/Module.symvers
           is missing; modules will have no dependencies and modversions.

  CC [M]  /media/Storage/Temp/sunxi-lirc-master/sunxi-lirc.o
  Building modules, stage 2.
  MODPOST 1 modules
/bin/sh: 1: scripts/mod/modpost: not found
make[2]: *** [__modpost] Ошибка 127
make[1]: *** [modules] Ошибка 2
make[1]: Leaving directory `/media/Storage/Temp/CubianSources/DebSource/linux-source-3.4.79-sun7i'
make: *** [all] Ошибка 2
Что дальше посоветуете?

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