Könnte ein 64-Bit-Hardwaregerät eine 32-Bit-Android-Version ausführen?

Diese Frage kommt von Wie kann ich feststellen, ob meine installierte Android-Version, nicht die CPU, eine 64-Bit- oder eine 32-Bit-Version ist?

Auf Desktop-Computern ist es möglich, ein 32-Bit- Betriebssystem auf einem 64-Bit- Hardwaregerät zu installieren, dh Sie können Ubuntu Linux 32-Bit auf einem AMD FX(tm)-9370 Achtkernprozessor (64-Bit) installieren.

Tritt der gleiche Fall für Android auf? Gibt es eine 32-Bit- und eine 64-Bit-Version für dasselbe 64-Bit-Gerät?

Einige Beispiellinks (wie ROM-Downloads in 32 und 64 Bit für dasselbe Android-Gerät) wären willkommen.

Antworten (3)

Es wird nicht deutlich erwähnt, aber ich nehme an, Sie sprechen von ARM-Architektur. „32-Bit-Android-Betriebssystem“ bezeichnet einen 32-Bit-Kernel und die Sammlung von ELF-Binärdateien und -Bibliotheken, die für die Ausführung auf einem 32-Bit-Prozessor kompiliert sind. Dieser Middleware-Stack enthält insbesondere app_processBinärdateien, die mit Namen ausgeführt werden zygoteund das vollständige Anwendungsframework von Android hosten. Es forkt Java Virtual Machines (für jede App), in denen Dalvik EXecutable ( .dex)-Code läuft, der weder 32-Bit noch 64-Bit ist. Aber die JVMs sind native Prozesse; entweder 32 oder 64 Bit, abhängig von den JNI-Bibliotheken, die die App enthält.

Wir können 32-Bit-Betriebssysteme auf 64-Bit-Geräten ausführen, wenn 64-Bit:

  1. Der Prozessor unterstützt die Ausführung von 32-Bit-Code, was normalerweise der Fall ist, da Abwärtskompatibilität erwünscht ist, aber nicht immer.

  2. Der Kernel unterstützt die Ausführung von 32-Bit-Code, da wir – die Prozesse auf Android – im Gegensatz zu Bare-Metal-Hypervisoren nicht direkt mit der Hardware zu tun haben.

BITNESS DES PROZESSORS

Die Unterstützung aller 64-Bit-Prozessoren für die 32-Bit-Ausführung ist nicht universell. Zum Beispiel enthalten Samsumg Exynos 9 Series 982x SoCs Cortex-A55 und A75, die (basieren auf ARMv8.x und sie) Unterstützung für aarch64und haben aarch32. Auf der anderen Seite enthalten Qualcomms Centriq 2400 - SoCs und Caviums Thunder X2 - SoCs ebenfalls ARMv8.x-Prozessoren, jedoch ohne aarch32Unterstützung.

Um die Gerätearchitektur zu finden, können wir lesen, /proc/cpuinfowelche Informationen aus dem Haupt-ID-Register des Prozessors verfügbar sind.

~$ cat /proc/cpuinfo
...
CPU implementer : 0x41
CPU architecture: 8
...
CPU part        : 0xd03
...
Hardware        : Qualcomm Technologies, Inc MSM8953

Aber es gibt keine direkten Informationen wie lmein Flag, um die 32/64-Bit-Unterstützung zu bestätigen. Wir brauchen also technische Details der Hardware. Gibt gemäß den Anforderungen von Google an, CPU architecture: 8dass es sich um ein ARMv8Gerät handelt. Siehe auch diesen Commit . Und hier ist die Hex-to-Mensch-lesbare Dekodierungskarte, die der lscpuBefehl verwendet.

~$ lscpu | grep -E 'Vendor |Model '
Vendor ID:           ARM
Model name:          Cortex-A53

Andere Möglichkeiten, SoC-Informationen zu erhalten:

~$ cat /sys/firmware/devicetree/base/model
Qualcomm Technologies, Inc. MSM8953 + PMI8950 QRD SKU3
~$ cat /sys/devices/soc0/{vendor,family,machine}
Qualcomm
Snapdragon
MSM8953

Aus den technischen Spezifikationen von Qualcomm Snapdragon 625 ( MSM 8953 ) und Cortex-53 geht hervor, dass es auf der ARMv8-Architektur basiert, die beide Befehlssätze verarbeiten kann: aarch64und aarch32.

KERNEL'S BITNESS

Als dem Linux-Kernel arm64Unterstützung hinzugefügt wurde , war auch der 32-Bit-Kompatibilitätsmodus enthalten. Wenn der Kernel mit gebaut IKCONFIG_PROCwurde, bestätigen Sie mit:

~# zcat /proc/config.gz | grep -E 'CONFIG_ARM64=|CONFIG_COMPAT=|BINFMT'
CONFIG_ARM64=y
CONFIG_COMPAT=y
CONFIG_BINFMT_ELF=y
CONFIG_COMPAT_BINFMT_ELF=y
CONFIG_BINFMT_SCRIPT=y

Die 64-Bit-ELF-Dateien werden also nativ mit binfmt_elf ausgeführt, während 32-Bit-ELF-Dateien mit compat_binfmt_elf ausgeführt werden . Siehe Details in dieser Antwort .

Wird normalerweise uname -mverwendet, um die Architektur des vom Kernel unterstützten Geräts zu finden. Es zeigt die Persönlichkeit ( Ausführungsdomäne ) des Prozesses, der standardmäßig auf die primäre Architektur des Kernels ( PER_LINUX) zurückgreift. Der Linux-Kernel unterstützt jedoch das Ändern von Persoanlity , sodass dieser Ansatz verwirrend sein kann:

~$ uname -m
aarch64
~$ setarch linux32 uname -m
armv8l

Im letzteren Befehl unamewird unter einer 32-Bit- kompatiblen Persönlichkeit ausgeführt . Dasselbe würde passieren, wenn Sie eine App wie diese verwenden , die mit LINUX32Personality ausgeführt wird, unabhängig davon, ob Kernel und unameBinärdateien 64-Bit sind. Einzelheiten finden Sie unter this und this . lscpubestätigt auch die CPU-Betriebsmodi unter Verwendung desselben Phänomens.

BENUTZERCODE BITNESS

Jetzt kommt initder allererste Prozess, der vom Kernel ausgeführt wird, in den Userspace. Lassen Sie uns seine Bitness überprüfen. Wenn das 5. Byte 1 ist, ist es eine 32-Bit-ELF-Datei, wenn es 2 ist, ist die Binärdatei 64-Bit:

~# hexdump -n5 /proc/1/exe
0000000 457f 464c 0002

Oder verwenden Sie den fileBefehl:

~# file /proc/1/exe
/proc/1/exe: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked ...

Überprüfen Sie auf ähnliche Weise die Bitanzahl anderer wichtiger Betriebssystem-Binärdateien/Bibliotheken:

~$ file /system/lib*/libc.so
/system/lib/libc.so:   ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked ...
/system/lib64/libc.so: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked ...
~$ file /system/bin/linker*
/system/bin/linker:        ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked ...
/system/bin/linker64:      ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked ...

Das Betriebssystem verwaltet sowohl 64-Bit- als auch 32-Bit-Bibliotheken und dynamische Linker, da Apps beide Arten von Binärcode enthalten können (obwohl der Hauptteil Java/Dalvik-Bytecode sein muss). Beispielsweise ist das dnsmasqProgramm, das als DHCP-Server am Hotspot dient, eine 64-Bit-Binärdatei, während Google Play Services eine 32-Bit-Bibliothek verwendet:

~# readelf -a /system/bin/dnsmasq
  Class:                             ELF64
  Type:                              DYN (Shared object file)
  Machine:                           AArch64
      [Requesting program interpreter: /system/bin/linker64]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so]
~# readelf -a /data/data/com.google.android.gms/app_vision/ocr/libs/armeabi-v7a/libocr.so
  Class:                             ELF32
  Type:                              DYN (Shared object file)
  Machine:                           ARM
      [Requesting program interpreter: /system/bin/linker]
 0x00000001 (NEEDED)                     Shared library: [libc.so]

Ebenso ist es nicht ungewöhnlich, 32-Bit-Binär-Blobs von OEMs/SoC-Anbietern auf 64-Bit-ROMs zu haben. Sogar einige grundlegende Komponenten von AOSP werden von 64-Bit nicht unterstützt. Nehmen Sie ein Beispiel für audioserver.
So sehen Sie alle Prozesse, die im 32-Bit-Modus ausgeführt werden:

~# for p in $(ps -p 2 --ppid 2 --deselect -o pid=); do grep -qE '^.{8}[^-]' /proc/$p/maps || echo $p; done | xargs ps f -o pid,cmd -p
  PID CMD
 3359 /system/bin/mediaserver
 3358 /system/bin/cameraserver
 3357 /system/bin/audioserver
 3356 zygote
 5081  \_ webview_zygote
20824  |   \_ com.android.webview:sandboxed_process0
18609  \_ it.colucciweb.vpnclient
 3354 /vendor/bin/hw/android.hardware.audio@2.0-service
 2665 /vendor/bin/hw/android.hardware.camera.provider@2.4-service
 2335 /vendor/bin/mm-qcamera-daemon
 2278 /vendor/bin/wifidisplayhalservice
 2277 media.codec hw/android.hardware.media.omx@1.0-service
 2244 /system/bin/drmserver
  777 /vendor/bin/hw/android.hardware.drm@1.1-service.widevine
  773 /vendor/bin/hw/android.hardware.cas@1.0-service

Von diesen ist nur eine eine VPN-App, der Rest sind Betriebssystemprozesse.

FAZIT

Es ist also klar, dass, selbst wenn das Kernbetriebssystem 64-Bit ist, möglicherweise eine große Anzahl von Prozessen als 32-Bit ausgeführt werden, obwohl jeder Prozess und seine verknüpften Bibliotheken homogen sein müssen; entweder 32 oder 64 Bit. Und es gibt keine Einschränkung, wenn das Betriebssystem überhaupt keinen 64-Bit-Code enthält, aber Sie werden nicht viele Instanzen finden, da OEMs 64-Bit-Geräte mit 64-Bit-Binärcode ausliefern. Es geht mehr ums Geschäft als um Leistung; Dafür zahlt ein Benutzer. Es gibt jedoch Ausnahmen, bei denen das Geschäft nicht so sehr involviert ist: Raspberry Pi 3 hat eine 64-Bit-CPU, aber ein 32-Bit-Raspbian-Betriebssystem . Beispiele für Android-Telefone aus der Vergangenheit sind Galaxy E5, LG G Stylo, Moto G5 Plus, Lenovo A6000 Plus und MT6735-Geräte. Aber jetzt bewegt sich Android in Richtung 64-Bit und einige Geräte werden möglicherweise fallen gelassen32-Bit-Unterstützung schrittweise.

Tritt der gleiche Fall für Android auf? Gibt es eine 32-Bit- und eine 64-Bit-Version für dasselbe 64-Bit-Gerät?

Ja, nehmen Sie das Beispiel Moto G4 Plus .


VERWANDT: Android-Apps für „armeabi-v7a“- und „x86“-Architektur: SoC vs. Prozessor vs. ABI

Antwort ist ja. Sie können 32-Bit-Android auf 64-Bit-Chipsätzen ohne große Probleme ausführen. Aber es sollte eigentlich egal sein, auf welcher Version Sie sich befinden, da derzeit 90% aller verfügbaren Apps 32-Bit sind und keine 64-Bit-Hardware verwenden.

Einige Beispiellinks wären willkommen.
Ihre Behauptung, dass 90% der Apps 32-Bit sind, ist Unsinn, da die meisten Apps in Java geschrieben sind und daher unabhängig davon, auf welchem ​​​​ISA und Betriebssystem Sie sie ausführen.

Ja, du kannst. Tatsächlich haben einige frühe Geräte genau das getan. Es ähnelt dem, was wir auf der Desktop-Computing-Seite haben. Moto E2 ist ein Beispiel für einen 64-Bit-Prozessor, auf dem ein 32-Bit-Betriebssystem ausgeführt wird.

Einige Beispiellinks wären willkommen.