patchelt kernel modul kód fordítása meglevő kernelhez

Fórumok

Sziasztok!

 

Raspberry Pi Zero-n szeretnék betölteni egy patch-cselt kernel modult, de sajnos eddig minden próbálkozásom kudarcot vallott.

Az USB gadget mód egyik moduljához van egy régebbi patch amit teszteni szeretnék. A patch kódját már portoltam az aktuális kernel verzióra, és szerencsére egyszerű dolgom is volt mert nem konfliktolt semmi más változással, és maga a patcs-cselt kód is tisztán fordult.

Ami a Zero-t illeti, használtam rajta az rpi-update scriptet és így most "5.4.44+"-es kernelt futtat.

Fogtam a https://github.com/raspberrypi/linux.git tárolót, leklónoztam, átváltottam az rpi-5.4.y branch-re, fogtam a Pi Zero-s default configot mivel sajnos az rpi-update-es kernelben nincs /proc/config.gz), alkalmaztam a patch-cset és leforgattam a kernelt és a modulokat.

Tesztelésképpe megpróbáltam egy modult betölteni, ami viszont már sajnos nem sikerült:

root@zero:/data/git-clean-rpi-linux# insmod ./drivers/net/usb/cdc_mbim.ko
insmod: ERROR: could not insert module ./drivers/net/usb/cdc_mbim.ko: Invalid module format
root@zero:/data/git-clean-rpi-linux# dmesg -T | tail -n 1
[Fri Jul  3 10:23:59 2020] cdc_mbim: disagrees about version of symbol module_layout

Annak ellenére, hogy a hivatalos és az általam fordított modul szinte teljesen megegyezik:

root@zero:/data/git-clean-rpi-linux# uname -a
Linux zero 5.4.44+ #1320 Wed Jun 3 16:01:17 BST 2020 armv6l GNU/Linux
root@zero:/data/git-clean-rpi-linux# modinfo ./drivers/net/usb/cdc_mbim.ko
filename:       /data/git-clean-rpi-linux/./drivers/net/usb/cdc_mbim.ko
license:        GPL
description:    USB CDC MBIM host driver
author:         Bjørn Mork <bjorn@mork.no>
author:         Greg Suarez <gsuarez@smithmicro.com>
srcversion:     E78127BCABE41799AC5303D
alias:          usb:v*p*d*dc*dsc*dp*ic02isc0Eip00in*
alias:          usb:v1BC7p1041d*dc*dsc*dp*ic02isc0Eip00in*
alias:          usb:v03F0pA31Dd*dc*dsc*dp*ic02isc0Eip00in*
alias:          usb:v12D1p*d*dc*dsc*dp*ic02isc0Eip00in*
alias:          usb:v0BDBp*d*dc*dsc*dp*ic02isc0Eip00in*
alias:          usb:v*p*d*dc*dsc*dp*ic02isc0Dip00in*
depends:        cdc_ncm,cdc-wdm
intree:         Y
name:           cdc_mbim
vermagic:       5.4.44+ mod_unload modversions ARMv6 p2v8 
root@zero:/data/git-clean-rpi-linux# modinfo /lib/modules/5.4.44+/kernel/drivers/net/usb/cdc_mbim.ko
filename:       /lib/modules/5.4.44+/kernel/drivers/net/usb/cdc_mbim.ko
license:        GPL
description:    USB CDC MBIM host driver
author:         Bjørn Mork <bjorn@mork.no>
author:         Greg Suarez <gsuarez@smithmicro.com>
srcversion:     E78127BCABE41799AC5303D
alias:          usb:v*p*d*dc*dsc*dp*ic02isc0Eip00in*
alias:          usb:v1BC7p1041d*dc*dsc*dp*ic02isc0Eip00in*
alias:          usb:v03F0pA31Dd*dc*dsc*dp*ic02isc0Eip00in*
alias:          usb:v12D1p*d*dc*dsc*dp*ic02isc0Eip00in*
alias:          usb:v0BDBp*d*dc*dsc*dp*ic02isc0Eip00in*
alias:          usb:v*p*d*dc*dsc*dp*ic02isc0Dip00in*
depends:        cdc_ncm,cdc-wdm
intree:         Y
name:           cdc_mbim
vermagic:       5.4.44+ mod_unload modversions ARMv6 p2v8 
root@zero:/data/git-clean-rpi-linux#

Több problémamegoldási módszert is próbáltam a helyzet feloldására, mivel pár hibát én is elkövettem a munkám során:

  • egy Raspberry Pi 2-n forgattam le a kernelt és a modulokat először. Most már magán a Zero-n forgatom
  • a kernel header-ökből először a korábbi (rendszer által szállított) verzió headerjei voltak fent, de ezt lecseréltem azokra amik a git-es kernelforráshoz tartoztak, és rebuildeltem a kernelt és a modulokat

A fentiek ellenére továbbra sem tudom betölteni a frissen forgatott modulokat a futó rpi-update-es kernel mellé.

Van esetlek valamelyőtöknek ötlete, hogy mit felejthettem el, illetve mit próbálhatnék még meg?

Hozzászólások

elvileg azzal a kernel-header-rel kell lefordítani a modult, ami ahhoz a kernelhez tartozik, amelyikkel a modult használni akarjuk. (ugyebár, ha saját modult használunk, kernel frissítés után nem elég a .ko fájlt bemásolni a modulokhoz, hanem újra kell fordítani a modult is, és csak utána bemásolni)

-fs-
Az olyan tárgyakat, amik képesek az mc futtatására, munkaeszköznek nevezzük.

Az egyezó verzió és forrás kevés. A konkrét .config-nak és a compilernek is ugyanannak kell lennie. Ezt leginkább úgy lehet elérni, ha konkrétan ott fordítod a kernelt is, meg hozzá a modult is, és aztán őket együtt használod.

B) variáns, hogy a modulopcióknál kikapcsolod a kernel symbol versioninget, és amikor az eltérésekből így nem betöltési hiba, hanem crash lesz, akkor annak örülsz...

nem tudom működik-e még ez a scriptem, ezer éve nem néztem meg. Ha működik, akkor az eredményeképp elvileg ott lesz a "gyári" kernel forrás úgy felparaméterezve, ahogy fordították.

https://gist.github.com/azbesthu/3893319

Talán van benne pár dolog, ami segíthet.

Ja és közben meglett, be kell tölteni egy modult, hogy elérhető legyen a config.gz

sudo modprobe configs

ha csak egy adott modul kell neked akkor nemkell az egesz kernelt ujraforgatni (felteve hogy a patch csak a modul kodba nyult bele), csak a maket kell megfeleloen parameterezni. most igy elsore ezt talaltam: https://yoursunny.com/t/2018/one-kernel-module/ (6-os pont), https://itectec.com/ubuntu/ubuntu-how-recipe-to-build-only-one-kernel-module/, vagy megcsinalhatod hogy a kivant modul forrasat kimasolod egy dirbe a kernelsrc-bol, es ott forditod le: https://qnaplus.com/how-to-compile-linux-kernel-module/, vagy igy: https://stackoverflow.com/questions/34379013/insmod-error-inserting-hello-ko-1-invalid-module-format

szerintem ez megoldja az invalid module format hibadat is, mert igy a jo kernel-headerrel lesz buildelve

A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

Ezt a guide-ot próbáltam meg követni szinte szó szerint, de az eredmény nem változott:

root@zero:/data/linux-5.4.50+-ec8bbdcf5b0b162ec240b8b168ccc49aaa612926# insmod ./drivers/net/usb/cdc_mbim.ko
insmod: ERROR: could not insert module ./drivers/net/usb/cdc_mbim.ko: Invalid module format
root@zero:/data/linux-5.4.50+-ec8bbdcf5b0b162ec240b8b168ccc49aaa612926# dmesg -T | tail 
[Mon Jul  6 20:32:03 2020] cdc_mbim: disagrees about version of symbol module_layout
root@zero:/data/linux-5.4.50+-ec8bbdcf5b0b162ec240b8b168ccc49aaa612926# cp ./drivers/net/usb/cdc_mbim.ko /lib/modules/5.4.50+/kernel/drivers/net/usb/cdc_mbim.ko
root@zero:/data/linux-5.4.50+-ec8bbdcf5b0b162ec240b8b168ccc49aaa612926# depmod
root@zero:/data/linux-5.4.50+-ec8bbdcf5b0b162ec240b8b168ccc49aaa612926# modprobe cdc_mbim
modprobe: ERROR: could not insert 'cdc_mbim': Exec format error
root@zero:/data/linux-5.4.50+-ec8bbdcf5b0b162ec240b8b168ccc49aaa612926# dmesg -T | tail 
[Mon Jul  6 20:32:03 2020] cdc_mbim: disagrees about version of symbol module_layout
[Mon Jul  6 20:46:12 2020] usbcore: registered new interface driver cdc_ncm
[Mon Jul  6 20:46:12 2020] usbcore: registered new interface driver cdc_wdm
[Mon Jul  6 20:46:12 2020] cdc_mbim: disagrees about version of symbol module_layout

Guide:

- letöltöd és telepíted a bináris kernelt modulokkal
- letöltöd a kernel forrást
- bekapcsolod pont ugyanazokat a kapcsolókat (.config)
- lefordítod a modulodat ebben a környezetben
- telepíted a lefordított modulodat

Ez elvileg működhet, feltéve, hogy ugyanazt a környezetet sikerül előállítanod (ugyanaz a forrás, ugyanaz a compiler, ugyanaz a .config).

Az, ami viszont egészen biztosan működik:

- letöltöd a kernel forrást
- bekapcsolod azokat a kapcsolókat, amiket szeretnél
- lefordítod a kernel és a modulokat
- telepíted a lefordított kernelt és a modulokat
- lefordítod a modulodat ebben a környezetben
- telepíted a lefordított modulodat

A következő próbálkozás valószínűleg az lesz, hogy lecserélem a gyári kernelt saját fordításúra, és akkor úgy biztosan be fogja tudni tölteni a saját fordítású modulokat.

Mivel az rpi-update-es kernellel (5.4.44+) próbálkoztam eredetileg, és azzal nem sikerült, így fogtam magam és egy friss telepítésű raspbian-nal próbálkoztam újra.
Az alapértelmezett kernel forrását sikeresen lehúztam a github-os scripted segítségével, de a forgatás után a modulokat továbbra sem sikerült betöltenem sajnos.

A következő próbálkozás valószínűleg az lesz, hogy lecserélem a gyári kernelt saját fordításúra, és akkor úgy biztosan be fogja tudni tölteni a saját fordítású modulokat.

A kernel git hash-nek ugyan annak kell lennie, meg a confignak is. Amúgy nem fog betöltődni.

Amúgy meg nincs kernel source csomag a distródban? Azt szedd le, ne a gitről húzd le. /usr/src/kernel-ben szépen ott lesz egy forrás amiben 'make modules_prepare' után azt forgatsz amit akarsz.