ARMv8 bot eine Erweiterung auf 64 Bit, war aber auch weiterhin für reine 32-Bit-Prozessoren definiert. So blieb das Profil ARMv8-M grundsätzlich 32-bittig, R und A gibt es für beides.
Nur ARMv8A ist 32- und 64-bittig.
ARMv8 (ohne das "A") hat keinen 32-Bit-Support mehr.
Ein Beispiel für ARMv8A sind die Raspberry-Pi Modelle 3 und höher. Diese können sowohl ein 32- oder 64-Bit Kernel verwenden, der Userspace ist hingegen - zumindest unter Raspbian - immer 32 Bit.
Dadurch läuft eine SD-Karte mit Raspbian auf jedem RPi-Modell, nicht nur auf den neuesten.
Hinweis: Um das 64-Bit-Kernel zu aktivieren, in der /boot/config.txt
einen Abschnitt
[pi3]
arm_64bit=1
[pi4]
arm_64bit=1
hinzufĂĽgen. Allerdings muss dazu auch ein aktuelles Raspbian installiert sein, welches bereits ein 64-Bit-Kernel in /boot mitliefert.
Man hat dann das beste zweier Welten:
* Ein 64-Bit Kernel so dass ein größtmöglicher Teil des 32-Bit Adressraums für die Benutzerprozesse zur Verfügung steht. (Bei einem 32-Bit-Kernel wird in der Regel die Hälfte des Adressraums eines Prozesses für den Zugriff vom Kernel aus reserviert.)
* Ein 32-Bit Userspace, bei dem Pointer und size_t Variablen nur halb so groß sind wie es bei einem 64-Bit Userspace der Fall wäre, und daher auf dein RPi-Modellen mit nur wenig RAM (weniger als 4 GiB) viel von diesem wenigen RAM einspart.
* Überwiegend schneller. 32-Bit-Programme sind in der Regel schneller als 64-Bit-Programme, da sie weniger Speicher bewegen müssen. Bei einem Vergleich des 32-Bit APIs (das x32 API, nicht zu verwechseln mit dem i386- oder i686-API) vs. dem 64-Bit API (das normale amd64-API) auf der amd64-Architektur wurde ein Performance-Einbruch von bis zu 20 % durch die Verwendung des 64-Bit-APIs gemessen. Der Grund waren die zusätzlichen Speicherzugriffe wegen der größeren Pointer- und size_t-Variablen. Bei ARM wird der Unterschied zwar geringer sein da zusätzliche Register im 64-Bit Modus einige Programme beschleunigen könnten. Aber vermutlich wird das trotzdem nur selten ausreichen um die zusätzlichen Speicherzugriffe zu kompensieren.
* Portabel - die 32-Bit-Programme laufen auch unter einem RPi1 und RPi0 - dort wird nur ein anderes Kernel geladen; der Rest bleibt gleich.