Forum: PC-Programmierung Linux Kernel-Modul für ARM unter x86 kompilieren


von Tobi (Gast)


Lesenswert?

Hallo,
ich versuche seit ein paar Tagen ein selbst geschriebenes Kernel-Modul 
für ein eigebettetes System mit ARM-Architektur zu Kompilieren. Hier ist 
ein link zu dem System:
http://www.rocketboards.org/foswiki/Documentation/ArrowSoCKitEvaluationBoard
Ich kann das Modul unter Kubuntu Kompilieren, jedoch kann ich das Modul 
auf dem System nicht laden. Es kommt der Fehler, dass das Modul nicht 
kompatibel ist.

Könnt ihr mit ein paar Tips für das Cross-Compiling geben?

Hier das Modul zum testen:
1
#include <linux/init.h>
2
#include <linux/module.h>
3
MODULE_LICENSE("Dual BSD/GPL");
4
5
static int hello_init(void)
6
{
7
  printk(KERN_ALERT "Hello, world");
8
  return 0;
9
}
10
11
static void hello_exit(void)
12
{
13
  printk(KERN_ALERT "Goodbye, cruel world\n");
14
}
15
16
module_init(hello_init);
17
module_exit(hello_exit);

und hier das Makefile:
1
obj-m := hello.o
2
3
KERNEL_SRC_DIR=/home/tobi/linux-socfpga
4
PWD=$(shell pwd)
5
6
all:
7
  make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C $(KERNEL_SRC_DIR) \
8
    M=$(PWD) modules
9
10
clean:
11
  make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C $(KERNEL_SRC_DIR) \
12
    M=$(PWD) clean

unter /home/tobi/linux-socfpga befinden sich die Kernel Sources aus 
git://git.rocketboards.org/linux-socfpga.git zusätzlich habe ich die 
Linearo ARM toolchain hinzugefügt.

von Marius W. (mw1987)


Lesenswert?

Wenn du das Modul für ARM kompiliert hast, kannst du es doch nicht auf 
deinem Development-PC laden. Du musst das schon auf dem ARM-Board laden!

Gruß
Marius

von Frank W. (wesoft) Benutzerseite


Lesenswert?

Ich hab das schon so verstanden, daß Tobi das Modul auf dem Zielsystem 
laden wollte.

Wie sieht denn die Fehlermeldung genau aus?
Was gibt den "uname -a" auf dem Zielsystem aus?
Hast Du mal versucht den kompletten Kernel (mit deinem Modul) zu 
kompilieren?

von Frank W. (wesoft) Benutzerseite


Lesenswert?

Und was gibt modinfo zu Deinem Modul aus?

von Tux (Gast)


Lesenswert?

Ist es denn auch die richtige Linaro?

Also für dein Zielsystem?

von Hjunt (Gast)


Lesenswert?

Evtl. hilft das: 
http://derekmolloy.ie/beaglebone/beaglebone-adding-usb-wi-fi-building-a-linux-kernel/

Mir war es zu blöd ich hab direkt auf dem BBB gebaut.

von Tobi (Gast)


Lesenswert?

Den gesamten kernel mit modul habe ich noch nicht versucht zu 
kompilieren.
Hier die Ausgabe von modinfo:
filename:       /home/tobi/kernel-module/hello.ko
license:        Dual BSD/GPL
depends:
vermagic:       3.9.0-00161-ged01b8c SMP mod_unload ARMv7 p2v8

von Frank W. (wesoft) Benutzerseite


Lesenswert?

Wie sieht denn uname -a auf dem Zielsystem aus?

von Tobi (Gast)


Lesenswert?

Leider steht mir das Ziesystem erst morgen wieder zur Verfügung und kann 
es dadurch erst morgen herausfinden.

von Frank W. (wesoft) Benutzerseite


Lesenswert?

Ok, dann schau Dir auch mal an, was der Kernel ausgibt, wenn Du 
versuchst das Modul zu laden. Die Ausgabe von "dmesg" wäre hier 
interessant.

Frank

von Tobi (Gast)


Lesenswert?

Ich habe die vermutung, dass die Kernelversion des Ziesystems nicht mit 
den Kernel-Sources übereinstimmen. Ich habe vorher ein fertiges Image 
genutz. Jetzt wollte ich den Kernel usw. nach der Anleitung:
http://zhehaomao.com/blog/fpga/2013/12/24/sockit-2.html
neu Kompilieren. Jetzt hänge ich bei Schritt 5 und nach den Ausführen 
von make kommt dieser Fehler:

>>> toolchain-external undefined Configuring
Cannot execute cross-compiler 
'/home/tobi/linaro/bin/arm-linux-gnueabihf-gcc'
make: *** 
[/home/tobi/buildroot/output/build/toolchain-external-undefined/.stamp_c 
onfigured]  Error 1

Jedoch existiert die Option Set “External toolchain header series” to 
“3.1.x” unter Buildroot nicht

von Frank (Gast)


Lesenswert?

Tobi schrieb:
> Ich habe die vermutung, dass die Kernelversion des Ziesystems nicht mit
> den Kernel-Sources übereinstimmen

Das sagt Dir der Kernel ganz genau, wenn Du versuchst des Modul zu 
laden. Was gibt denn die Ausgabe von dmesg?

Frank

von Tobi (Gast)


Lesenswert?

Es kommt die Meldung:
hello: version magic '3.9.0-00161-ged01b8c SMP mod_unload ARMv7 p2v8 ' 
should be '3.9.0 SMP mod_unload ARMv7 p2v8 '

von Frank (Gast)


Lesenswert?

Tobi schrieb:
> Es kommt die Meldung:
> hello: version magic '3.9.0-00161-ged01b8c SMP mod_unload ARMv7 p2v8 '
> should be '3.9.0 SMP mod_unload ARMv7 p2v8 '

Damit ist es keine Vermutung mehr :-) Die Kernel haben verschiedene 
Versionsangaben.

Entweder baust Du Dein Modul mit der passenden Versionsangabe, oder Du 
baust einen neuen kompletten Kernel.

Welche Linux-Distribution verwendest Du denn? In aktuellen Ubuntus gibt 
es die ARM-Toolchain in der Repository. Da brauchst Du das 
Buildroot-Geraffel nicht.

von Hans Ulli K. (Gast)


Lesenswert?

Tobi schrieb:
> Den gesamten kernel mit modul habe ich noch nicht versucht zu
> kompilieren.
> Hier die Ausgabe von modinfo:
> filename:       /home/tobi/kernel-module/hello.ko
> license:        Dual BSD/GPL
> depends:
> vermagic:       3.9.0-00161-ged01b8c SMP mod_unload ARMv7 p2v8

Du hat ein Modul mit "git Kennung" compiliert.
Bitte mal
General Setup->Local version
deaktivieren.

Das Modul und Kernel müssen die gleiche Version haben

von Force (Gast)


Lesenswert?

IMHO hat insmod oder modprobe die opton "-f"

von Tobi (Gast)


Lesenswert?

@Hans
Kannst du mir genauer erklären wie ich die Git kennung entfernen kann 
oder wie ich aus git die Version 3.9.0 bekomme?

http://git.rocketboards.org/?p=linux-socfpga.git;a=summary

von Hans Ulli K. (Gast)


Lesenswert?

Die git Kennung wird per Kconfig

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
in
General Setup->Local version

in deinem Kernelsourcen geändert, nicht dort wo du deine ggf. 
Modulsourcen hast.
Also bei dir in
/home/tobi/linux-socfpga

Dein Makefile vom Modul z.B. in /home/tobi/kernel-modul "springt" da 
rein.

Was du aber auch machen kannst, ist dir einfach einen lokalen Branch zu 
erzeugen.
Dann kannst du das Modul und Kconfig/Makefiles anpassen.

von Hans Ulli K. (Gast)


Lesenswert?

was ich noch vergessen habe zu sagen:

Tobi schrieb:
> Den gesamten kernel mit modul habe ich noch nicht versucht zu
> kompilieren.
> Hier die Ausgabe von modinfo:
> filename:       /home/tobi/kernel-module/hello.ko
> license:        Dual BSD/GPL
> depends:
> vermagic:       3.9.0-00161-ged01b8c SMP mod_unload ARMv7 p2v8

ged01b8c
sagt aus das dein aktueller HEAD von den Kernelsourcen beim hash 
"ed01b8c" liegt.
Wenn ich die andere Zahl 00161 richtig deute sind zwischen Version 3.9.0 
und deinem aktuellen HEAD 161 Commits.
zu sehem mit

git log --oneline v3.9.0..HEAD | wc
ggf.
git log --oneline v3.9..HEAD | wc

von Tobi (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe glaube ein Brett vorm Kopf und vertehe nicht so ganz wie ich 
Makefile und Kconfig der Kernel Sources anpassen soll. Ich habe leider 
nicht so viele Erfahrungen mit Makfiles und der Kernelkompilierung unter 
Linux

von Frank (Gast)


Lesenswert?

Wie Hans Ulli schon schrieb:

cd /home/tobi/linux-socfpga
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

Dann unter
General Setup->Local version

die lokale Version löschen.

Danach baust Du Deine Modul einfach noch einmal.

von Tobi (Gast)


Lesenswert?

AAAHH OK das komische war, dass ich es vorher ausprobiert habe und 
jedesmal eine Fehlermeldung kam. Jetzt hat es geklapt jedoch ist jetzt 
ein + zu viel :(

3.9.0+ SMP mod_unload ARMv7 p2v8 ' should be '3.9.0 SMP
mod_unload ARMv7 p2v8

von Frank (Gast)


Lesenswert?

Tobi schrieb:
> AAAHH OK das komische war, dass ich es vorher ausprobiert habe und
> jedesmal eine Fehlermeldung kam. Jetzt hat es geklapt jedoch ist jetzt
> ein + zu viel :(
>
> 3.9.0+ SMP mod_unload ARMv7 p2v8 ' should be '3.9.0 SMP
> mod_unload ARMv7 p2v8

Hä? Wo kommt denn das + her?

Was gibt denn

grep CONFIG_LOCALVERSION /home/tobi/linux-socfpga/.config aus?

von Tobi (Gast)


Lesenswert?

In der .config steht:
#
# General setup
#
CONFIG_INIT_ENV_ARG_LIMIT=32
CONFIG_CROSS_COMPILE=""
CONFIG_LOCALVERSION=""
# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_HAVE_KERNEL_GZIP=y
CONFIG_HAVE_KERNEL_LZMA=y
CONFIG_HAVE_KERNEL_XZ=y
CONFIG_HAVE_KERNEL_LZO=y
CONFIG_KERNEL_GZIP=y
# CONFIG_KERNEL_LZMA is not set
# CONFIG_KERNEL_XZ is not set
# CONFIG_KERNEL_LZO is not set
CONFIG_DEFAULT_HOSTNAME="(none)"
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
CONFIG_SYSVIPC_SYSCTL=y
# CONFIG_POSIX_MQUEUE is not set
# CONFIG_FHANDLE is not set
# CONFIG_AUDIT is not set
CONFIG_HAVE_GENERIC_HARDIRQS=y

Unter CONFIG_LOCALVERSION war zu beginn nichts eingetragen. Jedoch ist 
durch die änderung von Automatically append version information to the 
verson string konnte ich das "-00161-ged01b8c" entfernen, was durch das 
+ ausgetauscht wurde.

von PittyJ (Gast)


Lesenswert?

Ich hatte das Problem auch mal. Kernel und Modul müssen von der gleichen 
Version kompiliert werden. Schon ein andere Buchstabe in den Strings, 
und nichts geht mehr.
Ich habe es ein paar Stunden mit Patchen versucht, und da von einem 
Problem zum nächsten gekommen.
Und so richtig komfortabel war es auch nicht.

Letztendlich habe ich ein Buildsystem komplett aufgesetzt, und damit 
zuerst den Kernel, und danach das Modul kompiliert. Dann passt alles 
zusammen.

Und Kernel kompilieren dauert zwar etwas, ist aber auch nur ein 'make'.

von Tobi (Gast)


Lesenswert?

Heureka!!!
Ich habe jetzt die Stelle gefunden, wo das + hinzugefügt wird :) in den 
Script setlocalversion stand:
# scm version string if not at a tagged commit
if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then
  # full scm version string
  res="$res$(scm_version)"
else
  # append a plus sign if the repository is not in a clean
  # annotated or signed tagged state (as git describe only
  # looks at signed or annotated tags - git tag -a/-s) and
  # LOCALVERSION= is not specified
  if test "${LOCALVERSION+set}" != "set"; then
    scm=$(scm_version --short)
    res="$res${scm:++}"
  fi
fi

Kurz angepasst und jetzt läuft es :) das modul konnte ich jetzt laden.

Vielen Dank für eure Hilfe

von Frank (Gast)


Lesenswert?

Wahrscheinlich hätte auch geholfen, das .git Verzeichnis zu löschen :-)

von Hans Ulli K. (Gast)


Lesenswert?

Es geht noch einfacher als Scripte zu ändern und das .git Verzeichnis zu 
löschen

git tag wochentag -a -m "Dies ist mein Wochentag"

Erzeugt ein tag mit dem Namen wochentag und gibt diesem noch eine 
Nachricht
"Dies ist mein Wochentag" dazu

von Frank (Gast)


Lesenswert?

Hans Ulli Kroll schrieb:
> git tag wochentag -a -m "Dies ist mein Wochentag"

Naja, ob das wirklich einfacher ist, als ein Verzeichnis zu löschen? :-)

rm -r .git


Aber Du hast schon Recht, Deine Lösung ist wahrscheinlich die 
korrekteste (gibts das überhaupt?)

LG,
Frank

von Hans Ulli K. (Gast)


Lesenswert?

Na ja,
wenn du nicht an deinem Code schraubst, oder schlimmer noch "pushen" 
willst

OK.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.