Kernel Kompilieren, kurzes Tutorial

  • 58 Antworten
  • Letztes Antwortdatum
rotation

rotation

Dauer-User
228
Ein Tutorial für jene, die selbst Kernel Kompilieren wollen:

Grundsätzlich basiert alles auf dem Folgenden für das G Tablet:
[GUIDE] Compiling and Installing Custom Kernel (based on pershoot's Kernel from git) - xda-developers
Hier nur kleine Ergänzungen, bzw. Erweiterungen.


1. Vorbereitung:

Ich empfehle eine Virtuelle Maschine und Ubuntu. Das hat den Vorteil, dass man keinen PC neu aufsetzen muss, Windows kann weiterverwendet werden. Ein Doppelbildschirm ist aber sehr praktisch, dann kann auf einem der Code betrachtet werden, auf dem anderen z.B. Internet Explorer und Infos suchen.

Im Terminal die Packages installieren:
sudo apt-get install git-core libncurses-dev lib32stdc++6 lzma
Ich weiß noch, dass es manche Packages nicht mehr gab, ich hab die dann selber gesucht, welche das waren, weiß ich aber nicht mehr. Die leiten sich aber aus den Namen ab, haben aber am Ende andere Bezeichnungen.

Weiters muss ein Verzeichnis erstellt werden und ihr müsst Besitzer sein, damit nicht dauernd sudo verwendet werden muss.

Weiters die Toolchain, bzw. der Crosscompiler:
https://android-build.linaro.org/jenkins/job/linaro-android_toolchain-4.6-linaro-master-with-generic-target/21/artifact/build/out/android-toolchain-eabi-linaro-4.6-2011.10-21-2011-10-15_01-08-47-linux-x86.tar.bz2

Das ist der Crosscompiler, mit dem keine SoD's mehr auftraten (zumindest bei mir). Fards scheint nun auch mit diesem zu arbeiten.
Diese Entpacken.
Für den Cross Compiler muss die der Pfad ...\arm-eabi\bin angegeben werden, sonst wird der nicht gefunden.

Weiters die Kernel Sources.
Fards: git://github.com/fards/ab73kernel-Hannspad-2632.git
oder meine: git://github.com/Gott/ab73kernel-Hannspad-2632.git

Github hat den Vorteil, dass man Änderungen einfach anderen mitteilen kann.
Weiters kann man auch nach Infos in Google suchen, z.B.: "ondemand governor tweak github".

2. Config

Die Configs sind in /arch/arm/config
Da sind mehrere drin.
Für uns "ab_per_adam_tegra_harmony_android_newbl_defconfig".

Wenn nun
make -C /usr/src/tegratab/gtab-2632/ ARCH=arm ab_per_adam_tegra_harmony_android_newbl_defconfig menuconfig
eingegeben wird, wird die Config geladen, nach dem verändern wird die in .config gespeichert.
(Der Punkt zeigt an, dass die Datei unsichtbar ist)
Ich weiß aber nicht, ob die ab_per_..... Config verändert wird.
Ich hab ein Script benutzt, die die .config automatisch wieder zurückkopiert.

3. Kompilieren

make -C /usr/src/tegratab/gtab-2632/ ARCH=arm CROSS_COMPILE=/usr/src/tegratab/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- zImage

Damit wird as zImage kompiliert. Es befindet sich anschließend im Ordner /arch/arm/boot/zImage.
Wichtig ist, dass der CrossCompile Pfad richtig ersetzt wird, gegen euren, oben heruntergeladen.

make -C /usr/src/tegratab/gtab-2632/ ARCH=arm CROSS_COMPILE=/usr/src/tegratab/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- modules

Hierdurch werden die Module kompiliert.

4. Packen

Wir verwenden die Methode von Koush.
Das erlaubt das Installieren beliebiger Dateien im CWM.
Koushs Methode ist auch auf github zu finden, es reicht aber, wenn wir ein ab73 Zip Archiv verwenden.
Einfach die Module und zImage darin löschen.

make -C /usr/src/tegratab/gtab-2632/ ARCH=arm INSTALL_MOD_PATH=/usr/src/tegratab/staging/system modules_install
Hierdurch werden die Module kompiliert und im Pfad .../staging/system gespeichert. Dort habt ihr dann einen Pfad /system/lib/modules/2.3.32-cyanogenmod/ ... mit weiteren Unterordnern. Die .ko Dateien sind die Module. Diese müssen ins ZIP archiv in den Ordner /lib/modules kopiert werden.
Ich hab mir damit mal das WLAN gebrickt, weil das Modul alt war, es wurde schlicht das alte verwendet, siehe Test Kernel Thread.
Nicht vergessen, das bcm4329 Modul mit dem dhd.ko zu ersetzen. Die dhd.ko ist das WLAN Modul.

Anschließend die Symlinks entfernen, im Ordner /system/lib/modules/2.6.32.28-cyanogenmod/
build und source. Windows Usern ist so etwas unbekannt, Windows kennt keine Symlinks.

Anschließend alles zippen, in den richtigen Pfaden. Das ab73 Kernel Zip ist eigentlich selbsterklärend.

Bitte verwendet dazu NUR Linux. Schlimmstenfalls 7zip unter Windows. Keinesfalls Winrar, das funktioniert nicht richtig. Die Zips haben dann nicht das richtige Format und können nicht installiert werden.
Vorteil von Linux ist, dass man auch Scripte schreiben kann. Die Befehle werden nacheinander abgearbeitet.
Anschließend via CWM installieren.



Zum Programmieren:
Ihr habt dann ein Verzeichnis .../ab73kernel-Hannspad-2632/
Darin sind alle Dateien, aus dem der Kernel besteht.
Wenn etwas zu einer bestimmten Funktion verändert werden soll, muss erst die betreffende Stelle gesucht werden. Das kann schonmal recht lange dauern. Bis man dann auch noch den Code versteht dauert es nochmal länger.

Kleine Liste:
Swappiness: mm/vmscan.c
touchscreen: /drivers/input/touchscreen/tegra_odm.c
Clocks und Voltages: /arch/arm/mach-tegra/nvrm/core/common/nvrm_clocks_limits.c

Für alles weitere müsst ihr Google bemühen.

Evtl. hab ich euch den Einstieg ins Kernel Programmieren etwas erleichtert.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: rebelt2i, muhahahaah, benlis und 6 andere
Make -jx ....
beschleunigt das erstellen enorm.
Wobei x=Anzahl der CPU-Kerne * 2
also -j8 bei einem Quadcore.


Sent from my MB525 using Tapatalk
 
wie kann ich mehrere Optionen angeben?
-C -j4 gibt bei mir immer einen Fehler.

Könnten hier Race Conditions entstehen?
 
Hi,

danke erstmals für das Tutorial :)

Mir sind aber ein paar Kleinigkeiten aufgefallen:

unter 2. sind die config Dateien unter

<source_dir>/arch/arm/configs

und den Ordner /usr/src/tegratab/gtab-2632 in dem make Kommando gibts bei mir nicht :-(
Wenn ich den Ordner erstelle und dann das Kommando ausführe klappts auch nicht.

Hast du mir nen Tipp?

ich hab den ab73kernel-... ausgecheckt

Gruß
Basti

EDIT:

hier noch der Output:

ab73kernel-Hannspad-2632 # make -C usr/src/tegratab/gtab-2632/ ARCH=arm ab_per_adam_tegra_harmony_android_newbl_defconfig menuconfig
make: Gehe in Verzeichnis '/home/user/dev/ab73kernel-Hannspad-2632/usr/src/tegratab/gtab-2632'
make: *** Keine Regel, um »ab_per_adam_tegra_harmony_android_newbl_defconfig« zu erstellen. Schluss.
make: Verlasse Verzeichnis '/home/user/dev/ab73kernel-Hannspad-2632/usr/src/tegratab/gtab-2632'
 
Zuletzt bearbeitet:
du musst zuerst mit git clone das repo auf deine platte klonen...
 
Ja das hab ich gemacht. Ich hab mir 3 unterschiedliche git repos auf den rechner gecloned. Den originalen, den ab73 und den .36er kernel von fards. Den crosscompiler hab ich heruntergeladen und entpackt.

Wo liegt bei euch das /usr/src verzeichnis?
In den kernel ist zwar ein /usr verzeichnis aber ohne weitere Unterverzeichnisse...
 
ne, bei mir liegen die Kernel auf /usr/src/tegratab/gtab-2632/
also unter /usr/src/tegratab/
hab ich eingegeben git clone, da kopiert er dann das repo hin.

Die Ordner sind aber unterschiedlich, je nachdem, wo du anfängst, muss nicht tegratab heißen, der wurde von mir persönlich erstellt.
 
Aber das /usr/src liegt doch nicht direkt in /usr/src oder? Das repo checkst du doch unterhslb von deinem user account aus oder?

Also /home/user/ab73/usr/src
 
doch...
das ist der Pfad bei mir...

/usr/src/.......
nix mit home...

bei mir...
du kannst das natürlich ändern, aber dann musst du auch alle Pfade korrekt ändern...
 
Ok danke erstmal ich werd das probieren :)
Ich berichte dann :)
D.h. du hast das git repo nach /usr/src gecloned
 
/usr/src/tegratab/, dann clone...
 
Ah langsam wirds mir klar :)
 
Hallo,

jetzt hab ich mich daran versucht den kernel zu compilieren - leider klappts aber immernoch nicht.

ich hab die kernel sources unter /usr/src/tegratab/gtab-2632
die toolchain (gcc ver. 4.6.2) unter /usr/src/tegratab/prebuilt/bin (hier liegen die ganzen arm-eabi-gcc, ...)

soweit so gut :)

im gtab-2632 Verzeichnis mach ich dann:

Code:
make ARCH=arm ab_per_adam_tegra_harmony_android_newbl_defconfig menuconfig
#
# configuration written to .config
#
  HOSTCC  scripts/kconfig/lxdialog/checklist.o
  HOSTCC  scripts/kconfig/lxdialog/inputbox.o
  HOSTCC  scripts/kconfig/lxdialog/menubox.o
  HOSTCC  scripts/kconfig/lxdialog/textbox.o
scripts/kconfig/lxdialog/textbox.c: In Funktion »print_line«:
scripts/kconfig/lxdialog/textbox.c:323:9: Warnung: Variable »x« gesetzt, aber nicht verwendet [-Wunused-but-set-variable]
scripts/kconfig/lxdialog/textbox.c:323:6: Warnung: Variable »y« gesetzt, aber nicht verwendet [-Wunused-but-set-variable]
  HOSTCC  scripts/kconfig/lxdialog/util.o
  HOSTCC  scripts/kconfig/lxdialog/yesno.o
  HOSTCC  scripts/kconfig/mconf.o
  HOSTLD  scripts/kconfig/mconf
scripts/kconfig/mconf arch/arm/Kconfig


*** End of Linux kernel configuration.
*** Execute 'make' to build the kernel or try 'make help'.

dann startet das menuconfig Fenster. Es sind einige Punkte ausgewählt (also denke ich, dass die Konfiguration aus dem ab_... File richtig geladen wurde.

Dann versuche ich den Kernel mit der Grundkonfiguration zu bauen mit:

Code:
make ARCH=arm CROSSCOMPILE=/usr/src/tegratab/prebuilt/bin/arm-eabi- zImage

Und das ist der produzierte Fehler:

Code:
scripts/kconfig/conf -s arch/arm/Kconfig
  CHK     include/linux/version.h
make[1]: »include/asm-arm/mach-types.h« ist bereits aktualisiert.
  CHK     include/linux/utsrelease.h
  UPD     include/linux/utsrelease.h
  SYMLINK include/asm -> include/asm-arm
  CC      kernel/bounds.s
cc1: Fehler: nicht erkannte Kommandozeilenoption »-mlittle-endian«
cc1: Fehler: nicht erkannte Kommandozeilenoption »-mapcs«
cc1: Fehler: nicht erkannte Kommandozeilenoption »-mno-sched-prolog«
cc1: Fehler: nicht erkannte Kommandozeilenoption »-mno-thumb-interwork«
kernel/bounds.c:1:0: Fehler: unbekanntes ABI (aapcs-linux) für -mabi= switch
kernel/bounds.c:1:0: Fehler: falscher Wert (armv5t) für -march= switch
kernel/bounds.c:1:0: Fehler: Falscher Wert (cortex-a9) für -mtune= switch
make[1]: *** [kernel/bounds.s] Fehler 1
make: *** [prepare0] Fehler 2

Muss ich an dem Makefile noch was ändern, oder benötige ich eine andere Toolchain?

Gruß
Basti
 
welche Toolchain hast du?
versuche mal nach dem make noch "-C" dranzuhängen.
 
Gleiches Ergebnis :-(

Code:
make -C /usr/src/tegratab/gtab-2632/ ARCH=arm CROSSCOMPILE=/usr/src/tegratab/prebuilt/bin/arm-eabi- zImage
make: Gehe in Verzeichnis '/usr/src/tegratab/gtab-2632'
  CHK     include/linux/version.h
make[1]: »include/asm-arm/mach-types.h« ist bereits aktualisiert.
  CHK     include/linux/utsrelease.h
  SYMLINK include/asm -> include/asm-arm
  CC      kernel/bounds.s
cc1: Fehler: nicht erkannte Kommandozeilenoption »-mlittle-endian«
cc1: Fehler: nicht erkannte Kommandozeilenoption »-mapcs«
cc1: Fehler: nicht erkannte Kommandozeilenoption »-mno-sched-prolog«
cc1: Fehler: nicht erkannte Kommandozeilenoption »-mno-thumb-interwork«
kernel/bounds.c:1:0: Fehler: unbekanntes ABI (aapcs-linux) für -mabi= switch
kernel/bounds.c:1:0: Fehler: falscher Wert (armv5t) für -march= switch
kernel/bounds.c:1:0: Fehler: Falscher Wert (cortex-a9) für -mtune= switch
make[1]: *** [kernel/bounds.s] Fehler 1
make: *** [prepare0] Fehler 2
make: Verlasse Verzeichnis '/usr/src/tegratab/gtab-2632'

Die Version steht leider nirgends. Ich seh nur das der gcc in Version 4.6.2 ist.
Ich glaub aber ich hab die Toolchain von dem ersten Post hier im Thread runtergeladen
 
Zuletzt bearbeitet:
und welche toolchain?
 
Ich hab die Toolchain von der ersten Seite grad nochmals runtergeladen und mit der getestet - gleiches Ergebnis

Code:
 make ARCH=arm CROSSCOMPILE=/usr/src/tegratab/android-toolchain-eabi/bin/arm-eabi- zImage
  CHK     include/linux/version.h
make[1]: »include/asm-arm/mach-types.h« ist bereits aktualisiert.
  CHK     include/linux/utsrelease.h
  SYMLINK include/asm -> include/asm-arm
  CC      kernel/bounds.s
cc1: Fehler: nicht erkannte Kommandozeilenoption »-mlittle-endian«
cc1: Fehler: nicht erkannte Kommandozeilenoption »-mapcs«
cc1: Fehler: nicht erkannte Kommandozeilenoption »-mno-sched-prolog«
cc1: Fehler: nicht erkannte Kommandozeilenoption »-mno-thumb-interwork«
kernel/bounds.c:1:0: Fehler: unbekanntes ABI (aapcs-linux) für -mabi= switch
kernel/bounds.c:1:0: Fehler: falscher Wert (armv5t) für -march= switch
kernel/bounds.c:1:0: Fehler: Falscher Wert (cortex-a9) für -mtune= switch
make[1]: *** [kernel/bounds.s] Fehler 1
make: *** [prepare0] Fehler 2

und hier noch mit dem -C Parameter

Code:
make -C /usr/src/tegratab/gtab-2632/ ARCH=arm CROSSCOMPILE=/usr/src/tegratab/android-toolchain-eabi/bin/arm-eabi- zImage
make: Gehe in Verzeichnis '/usr/src/tegratab/gtab-2632'
  CHK     include/linux/version.h
make[1]: »include/asm-arm/mach-types.h« ist bereits aktualisiert.
  CHK     include/linux/utsrelease.h
  SYMLINK include/asm -> include/asm-arm
  CC      kernel/bounds.s
cc1: Fehler: nicht erkannte Kommandozeilenoption »-mlittle-endian«
cc1: Fehler: nicht erkannte Kommandozeilenoption »-mapcs«
cc1: Fehler: nicht erkannte Kommandozeilenoption »-mno-sched-prolog«
cc1: Fehler: nicht erkannte Kommandozeilenoption »-mno-thumb-interwork«
kernel/bounds.c:1:0: Fehler: unbekanntes ABI (aapcs-linux) für -mabi= switch
kernel/bounds.c:1:0: Fehler: falscher Wert (armv5t) für -march= switch
kernel/bounds.c:1:0: Fehler: Falscher Wert (cortex-a9) für -mtune= switch
make[1]: *** [kernel/bounds.s] Fehler 1
make: *** [prepare0] Fehler 2
make: Verlasse Verzeichnis '/usr/src/tegratab/gtab-2632'
 
Ah habs glaub ich gefunden... Der Parameter muss

CROSS_COMPILE und nicht CROSSCOMPILE heißen :cool2:

er kommt zumindest weiter als vorher
 
Hier noch ein paar kleine Anmerkungen zur Anleitung:


  • "..._defconfi menuconfig..." <- da fehlt das "g" :lol:
  • lzma wird benötigt (war bei Ubuntu 11.10 nicht vorinstalliert)
  • im "git://github.com/Gott/ab73kernel-Hannspad-2632.git" fehlen aktuell einige Dateien, z.B. "include/linux/rcu_types.h"
Gruß,
Watz
 
  • Danke
Reaktionen: rotation
watz schrieb:
Hier noch ein paar kleine Anmerkungen zur Anleitung:


  • "..._defconfi menuconfig..." <- da fehlt das "g" :lol:
  • lzma wird benötigt (war bei Ubuntu 11.10 nicht vorinstalliert)
  • im "git://github.com/Gott/ab73kernel-Hannspad-2632.git" fehlen aktuell einige Dateien, z.B. "include/linux/rcu_types.h"
Gruß,
Watz

* geändert
* geändert
* Kann ich nicht beantworten. Ich habe das Repo von ab73 geforkt...
 

Ähnliche Themen

L
Antworten
1
Aufrufe
1.285
slickor
slickor
P
  • PsychoPeach
Antworten
13
Aufrufe
3.947
Monkey
Monkey
S
  • Shishar
Antworten
2
Aufrufe
1.239
cantax
C
Zurück
Oben Unten