Warum gibt es so viele verschiedene Android-Kernel (technische Antwort bitte)


17

Ist Android nicht ein gemeinsamer Kernel, der auf allen Geräten verwendet wird? Zum Beispiel wird CentOS auf Dell, HP und einer Vielzahl anderer Hardware installiert. Sicher gibt es verschiedene Module, aber es ist trotzdem CentOS.

Was ist der Grund, warum CyanogenMod immer "kaputt" ist? In Foren höre ich immer, dass sie daran arbeiten, diesen oder jenen Treiber zu portieren. Wenn sie den gleichen Kernel verwenden würden, würden die Treiber nicht einfach damit arbeiten? Ich sehe auch eine Million verschiedener Kernel-Typen für verschiedene Geräte.

Antworten:


24

Kernel variieren von Hersteller zu Hersteller. Viele dieser Kernel stammen aus der reinen Stock-Kernel-Reihe von CAF-Quellen. Diese Hersteller nehmen diese Quellen und passen sie an die verwendeten Boards / Chipsätze an. Außerdem implementieren sie ihre eigenen Treiber.

Schauen Sie sich um, es gibt verschiedene Touchscreens, verschiedene WLAN-Chipsätze, Beschleunigungsmesser, Sensoren, Batterien, Kompass, Sound und Grafiken.

Wenn Sie beispielsweise eine Kernelquelle von HTC nehmen, funktioniert dies auf einem Samsung nicht und umgekehrt.

Den Herstellern steht es frei, verschiedene Bits, die in die Leiterplatte eingebaut werden, auszuwählen oder auszulagern. Es gibt keine festen Regeln. Daher die Menge an Hacking / Modifikationen, um den Kernel zum Laufen zu bringen.

Sie dürfen sich nicht mit Linux-Distributionskernen vergleichen, in denen PCI, PCI-Express, SATA, VGA, SVGA, USB und Ethernet zum Einsatz kommen, da dies ein völlig anderes Ball-Park-Spiel ist. Der Hauptunterschied zu CentOS und zum Android-Linux-Kernel besteht darin, dass ALLE Treiber entweder als Module oder als integrierte Treiber kompiliert werden. Daher funktioniert jede Linux-Distribution einfach "out of the box". Bei Desktop-Linux-Distributionen - Sie haben eine Architektur - kann x86, also ein Linux-Kernel von beispielsweise einem Dell-PC, auf einem Lenovo sofort ausgeführt werden, sofern die Standardtreiber kompiliert sind.

Vergessen Sie nicht, dass es in der Android-Welt Varianten des Kernels gibt, die für bestimmte ARM-Chipsätze entwickelt wurden, wie z. B. ARMv6, ARMv7, TEGRA, EXYNOS und binäre Inkompatibilitäten. Wenn also ein Kernel für TEGRA kompiliert ist, vergessen Sie es, er wird auf ARMv7 nicht funktionieren!

Der Grund, warum einige Kernel auf Android "kaputt" zu sein scheinen, liegt beim Hersteller. Einige (Zte ist ein sehr gutes Beispiel) veröffentlichen eine geschlachtete Quelle, die möglicherweise aus der Quelle kompiliert wird, jedoch aufgrund eines fehlenden Treibers, der nicht durch die GPLv2- oder GPLv3-Lizenz abgedeckt ist, nicht gestartet werden kann. Das ist das Problem, daher müssen einige Hacker in Github nach Hinweisen suchen. Einige Hersteller, wenn nicht alle, halten sich daran. Die aktuelle Inkarnation von Ztes Quelle ist angeblich 2.6.35.7, aber in Wirklichkeit repräsentiert die eigentliche 2.6.32.9-Quellenbasis mit vielen Modifikationen nicht die wahre Kernelquelle für 2.6.35.7!

Hier müssen die Hersteller ihre jeweiligen Quellen freigeben, nicht nur aus Gründen der Kompatibilität mit GPLv2 oder höher, sondern auch, damit die Community sie modifizieren kann, z. B. um Übertaktungsfunktionen hinzuzufügen.

Hinter den Kulissen wird also gehackt, und es wird viel mit den Treibern herumgespielt, die versuchen, es zum Laufen zu bringen. Auch das Debuggen ist nicht einfach. Einige Treiber sind möglicherweise gegenlizenziert, ABER können je nach Klausel und Bedingungen nicht weitergegeben werden ausgehandelt.

Zum Glück hat sich dies mit der Kernel 3.xx-Quellenserie geändert, da die Android-Treiber nun in die Mainstream-Quellen integriert sind. Aber es gibt ein GOTCHA!

Versuchen Sie, einen 3.xx-Kernel auf ein vorhandenes Mobilteil zu portieren, das etwa 12 bis 18 Monate alt ist. Keine Chance für einen Schneeball in der Hölle, würde es funktionieren, das liegt daran, dass sich die 3.xx-Quellen aufgrund der unterschiedlichen Faktoren stark von der 2.6.x-Quelle unterscheiden und viel Hacking erfordern würden, um sie zum Laufen zu bringen - ich hätte es wissen müssen Portierung 2.6.38.6 Quelle für das Zte Blade und fehlgeschlagen.

Ebenso hat das neueste Kernel-Release 3.0.1 - bei der Arbeit am ics4blade-Projekt über Modaco - zahlreiche Versuche unternommen, es zu portieren, aber das liegt einfach an der Tatsache, dass Zte die Quelle sehr durcheinander gebracht hat, was die Portierung nahezu unmöglich machte .


Upvotes rundum !!! Danke für die ausführliche Antwort.
user974896

Gern geschehen! Alles was Sie sonst noch wissen müssen! : D
t0mm13b

Nach dem, was Sie sagen, sind die Treiber nicht alle als Module kompiliert, sondern in den Kernel selbst integriert. Selbst wenn CM einen funktionierenden Kernel auf einem Gerät erhält, kann es nicht einfach die XXX-Module in den neuen Build verschieben und funktionieren lassen, weil Möglicherweise sind keine XXX-Module vorhanden. Die Treiber müssen gejagt, gehackt (möglicherweise) und neu kompiliert werden.
user974896

2
Richtig und auch die Treiber sind unterschiedlich, sodass ein Treiber für den Touchscreen auf einem Mobilteil nicht auf einem anderen Mobilteil funktioniert, das einen anderen Touchscreen verwendet. Ein weiterer wichtiger Punkt: Einige Treiber sind von der Kernelversion abhängig. Zte hat eine Version des Atheros Wifi-Treibers für das Blade herausgebracht. Der Treiber funktioniert nur, wenn der Kernel die Version 2.6.35.7 oder eine andere Version hat. wifi pausen - das soll die Abhängigkeit auf eine ziemlich hackige und gebrochene Art und Weise demonstrieren, wie man so etwas macht.
t0mm13b

12

Die PC-Architektur basiert auf Standardkomponenten, da sie als Klone eines bestimmten Produkts, des IBM-PCs, erstellt wurde, die speziell für die Kompatibilität mit diesem Produkt und damit für die Kompatibilität untereinander entwickelt wurden. Im Allgemeinen können Sie ein Programm oder ein Peripheriegerät von einem PC-kompatiblen PC in einen anderen PC kopieren und damit rechnen, dass es funktioniert. Diese Fähigkeit ist so nützlich, dass die Menschen sie auch im Zuge der Weiterentwicklung der Technologie nachgefragt haben. Sie können eine PCI Express-Karte in jeden modernen PC einbauen, so wie Sie damals eine ISA-Karte in jeden PC-Klon einbauen konnten.

Smartphones haben keine solche Geschichte. Sie sind als monolithische Produkte konzipiert, ein komplettes System aus Hardware und Software, das "einfach so funktioniert", wie es ist. Es ist nicht zu erwarten, dass Benutzer Teile aus einem Telefon entnehmen und in ein anderes stecken, sodass Ingenieure bei der Entwicklung ihrer Produkte die Interoperabilität nicht berücksichtigen müssen.

Selbst innerhalb des Linux-Kernel-Quellbaums sind die Treiber für ARM-Plattformen stark fragmentiert . Da Telefone in der Regel hinter verschlossenen Türen entworfen werden, führen Ingenieurteams in verschiedenen Unternehmen häufig doppelte Arbeiten aus, entwerfen im Grunde die gleiche Hardware wie ihre Konkurrenten und schreiben dann ihre eigenen Treiber für das eigene Design. Sobald sie fertig sind und das Produkt freigegeben ist, arbeiten sie direkt am nächsten. Es lohnt sich nicht, die Treiber für frühere Produkte umzugestalten oder mit den Fahrern der Mitbewerber zusammenzuführen. Das Ergebnis ist eine Fülle von einmaligen Treibern für Geräte, die ähnlich, aber nicht ganz gleich sind.

Darüber hinaus basieren Smartphones in der Regel auf SOCs , bei denen spezielle Hardware in den Prozessor integriert ist. In einigen Fällen kann es mehr als eine Frage sein, ob ein bestimmter Treiber geladen werden soll oder nicht. Der Kernel als Ganzes muss möglicherweise mit speziellen Konfigurationsoptionen für die Ausführung auf einem SOC erstellt werden, die nicht mit den speziellen Optionen für die Ausführung auf einem anderen SOC kompatibel sind.


5

Der Grund dafür ist, dass der Linux-Kernel von Android in der Regel nicht auf Android selbst kompiliert wird, sondern von einem anderen Computer aus kompiliert werden musste. Dies führt zu verschiedenen Problemen, da die Gerätekonfiguration zur Kompilierungszeit nicht verfügbar ist und es aus Platzgründen nicht möglich ist, einen generischen Kernel mit allen Treibern zu kompilieren (wohingegen in den meisten Desktop-Distributionen einfach alle Treiber in Module kompiliert wurden, die von einem initramfs geladen wurden). . Daher mussten Entwickler herausfinden, welche Treiber für die einzelnen Geräte gepackt werden sollten. Darüber hinaus verfügt jeder Fahrer im Allgemeinen über ein Dutzend Kompilierungszeitoptionen, um verschiedene Treiberfunktionen umzuschalten, und die Hersteller geben in der Regel ihre offizielle Konfiguration nicht frei (die schlimmsten Straftäter haben ihre Treiber nicht einmal als Open Source-Treiber oder haben die der Originalautoren nicht beibehalten) Kopie der aktuellen Treiber).

Die Treiberprogrammierung ist viel schwieriger als die Anwendungsprogrammierung, da es keinen Kernel gibt, der Sie vor unbeständiger Hardware schützt, die bestimmte Echtzeit-Timing-Anforderungen und dergleichen hat, und dies bedeutet, dass der Treiber selbst bei einem anderen Leistungsmerkmal verfehlt einige harte Echtzeitereignisse von der Hardware; Diese Fehler können als Fehler oder Leistungsprobleme auftreten.

Ein weiteres Problem ist die binäre Inkompatibilität. Es gibt zwei Gründe für binäre Inkompatibilität: Erstens den CPU-Typ, der in t0mm13b behandelt wurde, und zweitens das Problem, das für die Portierung relevanter ist, die ABI-Inkompatibilität (Application Binary Interface). Wenn Hersteller ihre Treiber nicht als Open Source anbieten, mussten Entwickler das kompilierte Modul aus einem Standard-ROM verwenden. Dies wirft verschiedene ABI-Inkompatibilitätsprobleme auf, da die Treibermodule selbst bestimmte Erwartungen an z. B. Strukturlayout- und Funktionsaufrufparameter haben und beim Kompilieren des Kernels nicht die Headerdatei zur Beschreibung des ABI zum Zeitpunkt des Treibers vorhanden ist wird zusammengestellt, Daher mussten die Entwickler den Treiber rückentwickeln, um eine Header-Datei zu erstellen, oder die Header-Dateien im Quellbaum wurden möglicherweise stark geändert, da der Treiber kompiliert wurde, und die Entwickler mussten diese Änderungen rückgängig machen, um den Kernel wieder mit dem ABI des Treibers kompatibel zu machen. Anders als beim Kompilieren aus dem Quellcode wird beim Kompilieren für Binärtreiber kein Kompilierungsfehler ausgelöst, da die Funktionsparameter nicht übereinstimmen oder die Struktur nicht kompatibel ist. Das Gerät stürzt einfach ab, während es ausgeführt wird, und das Debuggen dieser Probleme ist sehr schwierig. In der PC-Welt sind wir mit dem Durcheinander vertraut, das nVidia und ATi uns hinterlassen haben, da sie darauf bestehen, nur binäre Treiber freizugeben.

PC-Hardware ist im Allgemeinen auch besser standardisiert als mobile Hardware. Die meisten PCs benötigen keine Treiber für Vibratoren, Beschleunigungsmesser, Gyroskop, 3G-Radio, Näherungssensor, NFC usw. Selbst bei Geräten mit 3G wird die Verbindung zur Hardware normalerweise standardisiert hergestellt Verbindungen wie PCMCIA oder PCI-E.


4

Naja .... Treiber und Kernel sind nicht genau dasselbe.

Treiber steuern die Mobilfunkantenne, WLAN, Bluetooth usw. Dies sind proprietäre Treiber, da der Hersteller eine Möglichkeit (die Treiber) erstellen muss, um mit seiner Hardware zu kommunizieren.

Der Kernel ist eine Zwischenstufe zwischen dem Betriebssystem / der Anwendung und den eigentlichen Treibern (oder der CPU oder dem Speicher oder einer anderen Hardware). Auf diese Weise können Ihre Betriebssysteme / Apps mit diesen Hardwarekomponenten verbunden werden.

Alle Millionen von Kernen, die Sie sehen, unterscheiden sich wirklich nicht so sehr voneinander. In der Regel verwendet ein Programmierer / Modifizierer den vorhandenen Kernel und "optimiert" ihn, um eine unterschiedliche Leistung zu erzielen. Man kann im Grunde genommen sagen, dass sie nur (zum größten Teil) die "Konfiguration" des Kernels anpassen. In der Android-Welt beschäftigen sich diese Modder hauptsächlich mit: Übertakten oder Untertakten der CPU-Uhr (wichtig, um entweder Batterielebensdauer zu sparen oder um die meisten prozessintensiven Anwendungen wie Videospielemulatoren oder Videowiedergabe auszuführen) oder Volt (um die Batterielebensdauer zu verlängern, indem Sie Ihre CPU außerhalb der ursprünglich eingestellten Parameter betreiben ... was von Person zu Person unterschiedlich ist, da keine zwei CPUs zu 100% identisch sind).


Was ich meine ist zum Beispiel mit CyanogenMod gibt es immer Beschwerden über mein WLAN, Bluetooth, etc. funktioniert nicht. Warum müssen diese Treiber nach CyanogenMod "portiert" werden? Warum können sie nicht einfach die
Standardtreiber

Es gibt keinen Standardtreiber für die Geräte. Jedes Gerät hat unterschiedliche Treiber für die Hardware wie Kamera, WLAN-Chip usw. Und sie sind in der Regel Closed-Source-Geräte, sodass sie sich durch die Treiber hindurch "hacken" müssen, damit sie funktionieren.
Ryan Conrad

1
Ja, aber warum muss man hacken. Wenn sie mit dem OEM-Kernel funktionieren, können Sie die Treiberdateien und die zugehörigen Bibliotheken dann nicht einfach in die Cyanogen-Mod-Installation verschieben, da der Kernel im Grunde derselbe ist.
user974896

1

Telefone und andere eingebettete Systeme verfügen nicht über ein BIOS, das eine Abstraktion zwischen Hardware und Betriebssystem ermöglicht, da das Betriebssystem für die Hardware kompiliert wird, für die es bereitgestellt wird. Sogar Geräte, die denselben Chipsatz verwenden, können auf unterschiedliche Weise konfiguriert werden (mit alternativen Kommunikationsbussen usw.). Dies hat zur Folge, dass der Kernel entsprechend kompiliert werden muss. Da keine Änderungen an der Hardware zu erwarten sind, wird keine Hardwareerkennung durchgeführt. Der Kernel bootet schneller und ist daher kleiner - dies ist ein Standardprinzip eines eingebetteten Betriebssystems


0

CentOS wird auf einer anderen Hardware installiert, aber

  1. Es sind alles PCs, die sich weniger unterscheiden als Telefone,
  2. Ein Ubuntu-Kernel, ein Debian-Kernel und ein Elementary-Kernel sind alle verschiedene Kernelquellen.

Bezüglich Ihres zweiten Punktes lesen Sie die Antwort (en) weiter oben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.