Kernel selbst kompilieren

  • 2 Antworten
  • Letztes Antwortdatum
E

Exilant

Ambitioniertes Mitglied
5
Da das hier doch sehr weit verstreut ist, und ausserdem ein wenig komplizierter als es sein sollte, dachte ich ich fasse es mal zusammen.

Zum Kernel-kompilieren brauchen wir:

  • ein entwicklungssystem, ich gehe mal von einem Linux mit make usw. bereits installiert aus. Sollte unter Windows mit cygwin oder macosx aber ähnlich sein.
  • den kernel-quellcode, huawei bietet einen an unter Downloads - Huawei Device Co., Ltd.. (etwa 431 MB)
  • die android-ndk (oder eine andere arm-toolchain), und zwar die version 5c (etwa 45 MB). Die aktuelle Android NDK r7 (etwa 70 MB) kompiliert zwar den kernel problemlos, aber die kompilierten module können dann nicht geladen werden. (*)

dann alles entpacken
bei der ndk ist die toolchain dann im unterverzeichnis toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/

gcc-4.4 anpassungen, im kernel-makefile im hauptverzeichnis:
Code:
# conserve stack if available
KBUILD_CFLAGS   += $(call cc-option,-fconserve-stack)

# das hier einfuegen !
#changed for gcc 4.4 (Exilant)
KBUILD_CFLAGS += $(call cc-option,-fno-dwarf2-cfi-asm)
# ende eingefuegtes !

# Add user supplied CPPFLAGS, AFLAGS and CFLAGS as the last assignments
# But warn user when we do so
warn-assign = \

Cross-compilieren vorbereiten
Code:
export ARCH=arm
export CROSS_COMPILE=arm-eabi-
export PATH=$PATH:~/Hacking/android-ndk-r5c/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin/
# pfad anpassen !
make hw_msm7x27_defconfig
jetzt können mit make menuconfig weitere einstellungen gemacht werden, zum Beispiel das tun-modul aktivieren. Man kann in general setup eine lokale version zu definieren, dann sieht man später einfacher, welche version gerade installiert ist, allerdings wird dann die dhd.ko (wlan) nicht mehr geladen.

jetzt mit make das system bauen und erstmal etwas essen gehen, es dauert ein paar minuten (hier etwa 30, aber es ist auch ein stromspar-laptop)
Danach ist der kernel in arch/arm/boot/zImage und die module sind überall verstreut (tun.ko ist in drivers/net/ )

Installation
Die Installation ist so verwirrend, dass ich mir fast sicher bin, dass es einfacher gehen muss.

Wir wollen ein update.zip mit dem kernel erstellen. Als Basis nehmen wir Anykernel (https://github.com/koush/AnyKernel). In Anykernel muss noch in META-INF/com/google/android/updater-script
die zeile mit mount() geändert werden zu
Code:
mount("yaffs2", "MTD", "system", "/system");

dann ersetzen wir noch das zImage durch das kompilierte und kopieren unsere Module hinein. Aus dem Kernelverzeichnis heraus:
Code:
cp arch/arm/boot/zImage ../anykernel/kernel/
rm ../anykernel/system/lib/modules/*.ko
find . -iname *.ko | xargs -I {} mv {} ../anykernel/system/lib/modules

dann will das anykernel-verzeichnis in ein zip gepackt werden,
aus dem anykernel-verzeichnis heraus:
Code:
zip -r ../meinupdate.zip *
Jetzt sollte das update noch signiert werden, dazu nehmen wir die signapk.jar (soll angeblich in der android-sdk sein, aber bei mir ist sie es nicht)

Code:
java -jar signapk/signapk.jar signapk/testkey.x509.pem signapk/testkey.pk8 meinupdate.zip meinupdate_signed.zip

Das update kann nun zB mit CWM installiert werden.

Die Integration in das Stock-rom habe ich noch nicht verstanden (die /wifi/dhd.ko scheint verwandt mit der bcm4329.ko, wird in der Ramdisk geladen)

Nach der Installation
Wlan ist abgeschaltet, muss wieder aktiviert werden (geht nur, wenn die dhd.ko geladen werden konnte)

Weitere Informationen
mehr informationen zu den Installationswegen update.zip und kernel.img mit ramdisk: https://www.android-hilfe.de/forum/...-image-kernel-update-zip-erstellen.93786.html

zu (*): NDK Toolchain and "Unknown symbol _GLOBAL_OFFSET_TABLE_" in kernel module - Android Linux Kernel Development | Google Groups

zu den extra cflags: kernel module.c not handling R_ARM_REL32 - ARM Community

Konfigurationen
fuchsteufel schrieb im supertoast-thema:
fuchsteufel schrieb:
@droid84: Für den WLAN-Treiber musst du folgende Konfig einstellen

CONFIG_BCM4329=m
CONFIG_BCM4329_FW_PATH="/system/etc/firmware/fw_bcm4329.bin"
CONFIG_BCM4329_NVRAM_PATH="/proc/calibration"
CONFIG_WIFI_CONTROL_FUNC=y

Zumindest hat er mir dann das Modul gebaut. Getestet hab ichs aber noch nicht, könnte noch sein das die Pfade falsch sind.
Hat bei mir nicht funktioniert, im stock-rom ist da auch keine firmware, das modul laden schlägt dann fehl mit dhd_module_init: sdio_register_driver timeout

und droid84 schrieb im supertoast-thema
droid84 schrieb:
So, habe jetzt mal das zImage mit CONFIG_KERNEL_LZMA=y gebaut (tarball sicherheitshalber neu ausgepackt). Das Image ist dann 2457172 bytes groß. Immer noch 2400k also, aber immerhin kleiner.
Mein kernel ist bei hw_msm7x27_defconfig als zImage 3163364 B gross, etwas mehr als der stock kernel(extrahiert aus mtd0) mit 3133436 B.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: XantiX, Andy, Oma7144 und eine weitere Person
Danke für die super Anleitung. Mein eigener Kernel läuft mit CM7.2.0-RC1 1a. Jetzt gehts heute Abend ans probieren und modifizieren. Die Einstellungsmöglichkeiten sind doch ziemlich groß.

Sent from my fingers to your eyes :)
 
danke dafür. wird im nächstens update berücksichtigt und gewürdigt.
 

Ähnliche Themen

useron
  • useron
Antworten
1
Aufrufe
1.205
fuchsteufel
F
F
Antworten
9
Aufrufe
3.976
MegaTheLance
MegaTheLance
G
  • Gaec
Antworten
1
Aufrufe
1.781
Time_Bandit
Time_Bandit
Zurück
Oben Unten