Kernel-Module kompilieren - erster Versuch

  • 62 Antworten
  • Letztes Antwortdatum
Hat denn mittlerweile schon mal jemand den Kernel zum Laufen gebracht?
Wenn ja, wäre eine kleine Erklärung nett ;)
 
Ja, geht ganz einfach:

  • Zipfile von Samsung runterladen, dann auf alle Files dos2unix anwenden: find -type f | xargs dos2unix
  • vom Galaxy /proc/config.gz runterkopieren und als .config extrahieren
  • Cross-Compiler installieren, z.B. vom Android SDK (git checkout notwendig, beim Binary ist der nicht dabei) oder NDK; oder von CodeSourcery
  • im Kernel dir: make ARCH=arm menuconfig
  • make ARCH=arm CROSS_COMPILE=/dein/cross/compiler/arm-eabi-
    (oder wie auch immer er heißt, geht um das target prefix; beim SDK arm-eabi-gcc)
  • fastboot flash:raw boot arch/arm/boot/zImage
  • bcm4325.ko, dpram.ko und multipdp.ko nach /system/libmodules kopieren
 
Geht leider nicht so einfach:

Erstens: "dos2unix" konvertiert in diesem Fall nicht richtig. Besser mit sed -i -e 's/\r//g', sonst kompiliert irgend ein *.h nicht.

Zweitens: es gibt ein paar "echte" Binaries (siehe Anhang), da darf man das CRLF nicht einfach ersetzen.

Drittens: es fehlt die initrd. Die ist in den Kernel hineinkompiliert und wird nicht vom Bootloader als Datei hinzugeladen. Das muesste in .config die Einstellung CONFIG_INITRAMFS_SOURCE sein.

Bin auf der Suche nach dem Original-Initrd.img; kann man sicher aus einen existierendem Kernel rausholen. Heute aber keine Zeit mehr.

// Sven-Ola
 

Anhänge

  • non-biinaries.txt
    1,5 KB · Aufrufe: 298
sven-ola schrieb:
Geht leider nicht so einfach:

Erstens: "dos2unix" konvertiert in diesem Fall nicht richtig. Besser mit sed -i -e 's/\r//g', sonst kompiliert irgend ein *.h nicht.
Bei mir hat dos2unix funktioniert. Mit welchem Header hast du Probleme?

sven-ola schrieb:
Zweitens: es gibt ein paar "echte" Binaries (siehe Anhang), da darf man das CRLF nicht einfach ersetzen.
Stimmt natürlich, einfach alles konvertieren ist nicht wirklich sauber. Aber die aufgelisteten Files sind zum Kompilieren alle nicht notwendig, daher störts nicht wirklich (die Scripts hab ich nicht verwendet, ging auch so).

sven-ola schrieb:
Drittens: es fehlt die initrd. Die ist in den Kernel hineinkompiliert und wird nicht vom Bootloader als Datei hinzugeladen. Das muesste in .config die Einstellung CONFIG_INITRAMFS_SOURCE sein.

Bin auf der Suche nach dem Original-Initrd.img; kann man sicher aus einen existierendem Kernel rausholen. Heute aber keine Zeit mehr.

// Sven-Ola
Die hab ich aus dem Kernel-Image vom 1. Update (IG8) extrahiert. Dafür gibts hier ein fertiges Script.
 
So - jetzt hab' ich es auch hin. Mit swap und iptables. Hier meine Notizen, falls jemand selbst kompilieren will kann's ja hilfreich sein. Dateien sind hier:
Code:
http://81.89.105.192/linux-2.6.27-galaxy.patch.lzma
http://81.89.105.192/initrd-galaxy-2.6.27-GT-i7500I7500VIAIG6I7500XXIG8I7500XXIG8_500.tgz
Dieser Text bezieht sich auf http://img.kr.samsungmobile.com/images/opensource/download/OpenSource/GT-I7500_OpenSource.zip. Hinweis: alle ASCII-Dateien in diesem ZIP haben CRLF als Zeilenende. Konvertierung mit "find -type f | xargs sed -i -e '/\r//g'" (das erwischt auch ein paar Binärdateien, diese sollten für das Kompilieren aber nicht wichtig sein).

70e0eb7961110ff6a01eff8781333c8d GT-I7500_OpenSource.zip

Hinweise: der Samsung-Kernel ist ein Stock-2.6.27, allerdings wurde ein "Infinite Retry Loop in IP-Config" mit einer Änderung behoben (aus 2.6.27.14, siehe LKML 9d8dba6c979fa99c96938c869611b9a23b73efa9). Außerdem sind die Kernel-Sourcen wohl über einen Windows-Rechner gegangen, es fehlen großgeschriebene Dateien z.B. net/netfilter/xt_TCPMSS.c (das gibts auch als kleingeschriebene Datei net/netfilter/xt_tcpmss.c im Kernel-Tree und ein typisches Windows überschreibt dann).

* Den Kernel linux-2.6.27.tar.bz2 von kernel.org herunterladen. Auspacken und den Patch anwenden (der Patch enthält nur die Unterschiede vom Stock-2.6.27er Kernel auf das oben angeführte ZIP-Archiv):
tar xvjf linux-2.6.27.tar.bz2
lzcat linux-2.6.27-galaxy.patch.lzma | patch -p1 -d linux-2.6.27

* Vom Telefon die Konfiguration ziehen (bin faul und mache als "root" weiter):
sudo bash
cd linux-2.6.27
adb pull /proc/config.gz .
gunzip config.gz
mv config .config

* Die Initrd holen, auspacken und den Pfad in der .config eintragen, z.B. CONFIG_INITRAMFS_SOURCE="initrd/". Meine Initrd habe ich aus GT-i7500I7500VIAIG6I7500XXIG8I7500XXIG8_500.zip (später zurückgezogenes Update aus Aug 2009). In der Datei "/default.prop" sind außerdem die Einstellungen auf "ro.secure=0" und "ro.debuggable=1" geändert, damit der "root"-Zugriff funktioniert.

* Kompilieren, dabei 2 * mit [Return] den Benutzer "root" fuer die Initrd bestätigen:
make CROSS_COMPILE=/usr/src/android/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-

* Aufspielen mit "fastboot":
(Galaxy an USB stoepseln)
fastboot flash:raw boot arch/arm/boot/zImage
(Fastboot wartet, Galaxy ausschalten)
(Warten bis die Ladeanzeige die volle Batterie zeigt)
(Mit der Tastenkombination Annehmen + Powertaste halten und damit einschalten)
(Schwarzer Bildschirm, das Fastboot beginnt mit dem Flashen, 5 Sekunden)
(Mein Galaxy startet und läuft ganz normal [freu])

* Jetzt kommt die Kür: "make menuconfig", einschalten was man haben will. Wirklich wichtig: General/SWAP
[*], Net/Opt/Netfilter
[*], Net/Opt/Netfilter/Adv[ ] ("Advanced" ausschalten schaltet die einfachen Sachen automatisch als Modules ein). Konfiguration speichern und aufräumen mit "make CROSS_COMPILE=[siehe oben] clean". Dann noch einmal Kompileren/Aufspielen.

* Nun noch ein Swapfile. SSH in das Galaxy und dann:
dd if=/dev/zero of=/sdcard/swap.img bs=1048576 count=96
mkswap /sdcard/swap.img
swapon /sdcard/swap.img

Das wars, meine Kiste läuft... :)

Code:
localhost:/sdcard# free -m
             total       used       free     shared    buffers     cached
Mem:            93         92          1          0          0         22
-/+ buffers/cache:         69         24
Swap:           95          0         95
* Jetzt noch die Module hochladen (rfs.ko fehlt...!):
adb remount
for i in drivers/net/wireless/broadcom/bcm4325.ko drivers/dpram/dpram.ko drivers/dpram/multipdp.ko;do adb push $i /system/libmodules/;done

* Dann noch meine zusätzlichen Module für mein Debian hochladen:
tar cvzf /tmp/bla.tgz $(find -name "*.ko")
adb push /tmp/bla.tgz /tmp/
(zur Debian-Shell auf dem Galaxy wechseln)
mkdir /lib/modules/$(uname -r)/
cd /lib/modules/$(uname -r)/
tar xvzf /tmp/bla.tgz
depmod -a
iptables -nvL
(sollte die iptables-Module laden und was anzeigen)
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Cynob und Trass3r
Hmm, mein kernel (config angehängt) schickt das Galaxy in eine Endlosschleife beim booten. Nach einigen Durchläufen der Android-Animation startet es neu. Gibt es irgendeine Möglichkeit, sich die kernel messages anzusehen?
 

Anhänge

  • config.zip
    10 KB · Aufrufe: 167
Hey,

keine Ahnung, warum das beim ersten mal gleich funktioniert hat. Beim weiter basteln hatte ich dasselbe. Die Kernel-Module unter /system/libmodules/ passen nicht (sind für SWAP=NO) und stürzen wohl ab. Ich hab's dann so gemacht:

* Orig-Kernel draufmachen, Neustart
* adb remount
* adb shell mv /system/libmodules /system/libmodules.orig
* adb shell mkdir /system/libmodules
* Herunterfahren und Kernel-mit-Swap draufspielen
* Starten (ohne Module==Kein Dienst, läuft aber)
* adb remount
* for i in $(find -name bcm4325.ko -or -name dpram.ko -or -name multipdp.ko);do adb push $i /system/libmodules/;done

Und schon läuft's auch bei mir wieder:
Code:
root@pcacer:/usr/src/galaxy-kernel/linux-2.6.27# adb shell
# deb
su: access granted, courtesy of www.magicandroidapps.com
e2fsck 1.40.8 (13-Mar-2008)
/sdcard/debian.img: clean, 40884/73728 files, 160023/262144 blocks
root@localhost:/# free -m
             total       used       free     shared    buffers     cached
Mem:            93         91          2          0          0         23
-/+ buffers/cache:         68         25
Swap:           95          0         95
HTH
// Sven-Ola
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: sonic
Was ist eig mit dem Middle-Ordner, der das Bluetoothzeug enthält?
 
Trass3r schrieb:
Was ist eig mit dem Middle-Ordner, der das Bluetoothzeug enthält?
Das hat nichts mit dem Kernel zu tun, bluez steht einfach nur auch unter der GPL und daher mussten sie das auch veröffentlichen.
 
  • Danke
Reaktionen: Trass3r
Ah, danke für die Aufklärung ;)
Muss man denn nun eigentlich den Weg über den Originalkernel+Patch gehn oder kann man auch die unveränderten aus dem Samsungarchiv nehmen (bis auf die initrd)?
 
Nein, geht auch direkt mit dem Archiv von Samsung. Allerdings muss man vorher die DOS-Zeilenenden ins Unix-Format konvertieren, und wie sven-ola schon gesagt hat, fehlen ein paar Files, dies sowohl groß- als auch kleingeschrieben gibt. Die hab ich (soweit ich sie gebraucht hab) einfach von einem Standard-Kernel rüberkopiert.
 
Mein Galaxy ist jetzt oefter schon mal stehengeblieben. Einfach aus dem Schlafmodus heraus nicht mehr aufzuwecken (Batterie herausnehmen notwendig). Ich haben den Wireless-Treiber im Verdacht, da betreibe ich das selbstkompilierte bcm4325.ko. Jetzt probiere ich das Original (aus der letzten Firmware, scheint auch mit einem Swap-enabled Kernel zu laufen). In jedem Fall gibt es Unterschiede, ein "String-Diff" zeigt:
Code:
root@galaxy:/system/libmodules# diff /tmp/orig.txt /tmp/sot.txt
59c59
< %02X:%02X:%02X:%02X:%02X:%02X
---
> %x:%x:%x:%x:%x:%x
353c353
< Compiled on Jul  2 2009 at 11:17:28
---
> Compiled on Sep  6 2009 at 12:55:18
Die betreffende Stelle ist in src/dhd/sys/dhd_linux.c. Offenbar ein Bugfix von Samsung, dass in den veroeffentlichtem Quelltext nicht enthalten ist. Und sowieso: Samsung kocht wohl etwas eigenes, denn diese sprintf()-Zeile und das #if ANDROID_SPECIFIC ist in den Google-Quellen nicht enthalten (ref: android.git.kernel.org Git - platform/system/wlan/broadcom.git/history - src/dhd/sys/dhd_linux.c)

Bin gespannt, ob die Verwendung des Original-Moduls den Schlafzustand repariert.

Nachtrag: Mist - das Original-bcm4325.ko geht sofort baden (Reboot), wenn man Wireless einschaltet. Jetzt heisst es: Bugfixes von Samsung in die Quelltexte einpflegen. Einen hab' ich ja schon ("%x" -> "%02X").

// Sven-Ola
 
Zuletzt bearbeitet:
Oha - das sieht böse aus. Habe mir die Google-Quellen gezogen (git clone git://android.git.kernel.org/platform/system/wlan/broadcom.git) und mit dem Samsung-Stand verglichen. Auf den ersten Blick sehe ich viel Kram rund um dem Schlafmodus. Aber seht selbst (diff --exclude=".*" --exclude="*.o" --exclude="*.ko" -w -r galaxy-kernel/linux-2.6.27/drivers/net/wireless/broadcom galaxy-broadcom/broadcom/ anbei).

// Sven-Ola
 

Anhänge

  • diff.txt
    41 KB · Aufrufe: 1.117
  • Danke
Reaktionen: Fr34kFi5h
Änderungen, die nicht veröffentlich werden, sind natürlich böse. Verdammte Firmenbürokratie... ich kann mir gut vorstellen, dass die Entwickler, die wirklich daran arbeiten, kein Problem mit einem öffentlichen git tree hätten. Kann man nur hoffen, dass Harald Welte Erfolg hat und sich das auch zu anderen Abteilungen durchspricht: Harald Welte's blog

Zu diesem Format-String: Kann mir nicht wirklich vorstellen, dass der einen großen Unterschied macht. Wird ja nur in ein File geschrieben... aber wtf? Wofür schreiben die ausm Kernel heraus die MAC-Adresse in ein File mit fixem Namen? Von ifconfig haben die wohl noch nichts gehört...

PatchDiff (IDA-Plugin) findet bei nem kurzen Test keine Unterschiede zwischen dem bcm4325.ko von IH7 und meinem seblst kompilierten. Entweder am eigentlichen Code hat sich wirklich nichts geändert, oder PatchDiff funktioniert doch nicht so toll.
 
Oh - wow. Jetzt sind wir schon bei IDA-pro. OK - also ich komm' zum gleichen Ergebnis (mit objdump -D und dann das TEXT-Segment vergleichen). Ausser dem "%02X" scheint nichts geändert zu sein. Ja, ein oeffentliches Repo wäre prima, am besten gleich mit Schreibzugriff für die Community. Mal sehen, ob Harald in Korea was bewirken kann. In diesem Fall sind es evnt. nicht die Koreaner, sondern die Leute bei Broadcom - die haben ja für Ihren Wifi-Kram eine längere "history of nondisclosures and uncoordinated code drops".

Aber heute gibt's erstmal frische Binaries - schau' ich mir doch erstmal das aktuelle Update an...
 
sven-ola schrieb:
Mein Galaxy ist jetzt oefter schon mal stehengeblieben. Einfach aus dem Schlafmodus heraus nicht mehr aufzuwecken (Batterie herausnehmen notwendig). Ich haben den Wireless-Treiber im Verdacht, da betreibe ich das selbstkompilierte bcm4325.ko. Jetzt probiere ich das Original (aus der letzten Firmware, scheint auch mit einem Swap-enabled Kernel zu laufen). In jedem Fall gibt es Unterschiede, ein "String-Diff" zeigt:
Code:
root@galaxy:/system/libmodules# diff /tmp/orig.txt /tmp/sot.txt
59c59
< %02X:%02X:%02X:%02X:%02X:%02X
---
> %x:%x:%x:%x:%x:%x
353c353
< Compiled on Jul  2 2009 at 11:17:28
---
> Compiled on Sep  6 2009 at 12:55:18
Die betreffende Stelle ist in src/dhd/sys/dhd_linux.c. Offenbar ein Bugfix von Samsung, dass in den veroeffentlichtem Quelltext nicht enthalten ist. Und sowieso: Samsung kocht wohl etwas eigenes, denn diese sprintf()-Zeile und das #if ANDROID_SPECIFIC ist in den Google-Quellen nicht enthalten (ref: android.git.kernel.org Git - platform/system/wlan/broadcom.git/history - src/dhd/sys/dhd_linux.c)

Bin gespannt, ob die Verwendung des Original-Moduls den Schlafzustand repariert.

Nachtrag: Mist - das Original-bcm4325.ko geht sofort baden (Reboot), wenn man Wireless einschaltet. Jetzt heisst es: Bugfixes von Samsung in die Quelltexte einpflegen. Einen hab' ich ja schon ("%x" -> "%02X").

// Sven-Ola

Also die Abstürze (Batterie-rein-raus) sind schon oft auf "normalen" (also nicht custom compiled) Geräten aufgetaucht. Dass dies dennoch die Schuld des Wifiadapters ist, könnte aber durchaus sein.

Ein anderes Phänomen ist ja der (fast) Systemstillstand wenn man versucht sich in ein WPA2-Enterprise Netz einzuloggen (https://www.android-hilfe.de/forum/...a_supplicant-conf-bzw-bcm_supp-conf.5037.html).

Meiner Meinung nach enthält der Wlantreiber sehr viele Bugs.
 
Ist der Quelltext vom neuen Update eigentlich auch schon irgendwo verfügbar?
Wer hat damals eigentlich den Link gefunden, ich wüsste nicht wie ich das über die Seite von Samsung finden söllte.
 
  • Danke
Reaktionen: sonic
Weiß jemand, wie man die setzt?
 
Die Kernelbootparams kommen aus der .config. Ich nehm' an, dass das arm9boot bzw. das arm11boot da nicht dran herumfummelt. In der Default-config steht dann das hier:

CONFIG_CMDLINE="init=/sbin/init root=/dev/ram rw initrd=0x11000000,16M console=ttyDCC0 mem=88M"

Wo ich da gerade draufschaue: mem=88M !? Muss direkt nochmal in die dmesg gucken, wieso nicht 96 - das wären 8M mehr...
 

Ähnliche Themen

DerOhneNick
Antworten
3
Aufrufe
1.437
DerOhneNick
DerOhneNick
M
  • mikesch dauerhaft
Antworten
12
Aufrufe
2.552
BOotnoOB
BOotnoOB
M
  • Moonblast
Antworten
1
Aufrufe
1.219
swa00
swa00
Zurück
Oben Unten