No se menciona claramente, pero supongo que se refiere a la arquitectura ARM. "Sistema operativo Android de 32 bits" significa un núcleo de 32 bits y la colección de binarios y bibliotecas ELF que se compilan para ejecutarse en un procesador de 32 bits. Esta pila de middleware incluye especialmente app_process
binario que se ejecuta con el nombre zygote
y alberga el marco completo de aplicaciones de Android. Bifurca las máquinas virtuales de Java (para cada aplicación) en las que Dalvik EXecutable ( .dex
) se ejecuta un código que no es ni de 32 ni de 64 bits. Pero las JVMs son procesos nativos; de 32 o 64 bits dependiendo de las librerías JNI que contenga la aplicación.
Podemos ejecutar el sistema operativo de 32 bits en un dispositivo de 64 bits si es de 64 bits:
-
El procesador admite la ejecución de código de 32 bits, lo que suele ser el caso porque se desea la compatibilidad con versiones anteriores, pero no siempre.
-
El kernel soporta la ejecución de código de 32 bits porque, a diferencia de los hipervisores bare-metal, nosotros -los procesos en Android- no tratamos directamente con el hardware.
LA BITÁCORA DEL PROCESADOR
La compatibilidad de todos los procesadores de 64 bits con la ejecución de 32 bits no es universal. Por ejemplo, los SoCs Samsumg Exynos 9 Series 982x contienen Cortex-A55 y A75 que (están basados en ARMv8.x y ellos) tienen soporte para aarch64
y aarch32
. Por otro lado, Qualcomm Centriq 2400 SoCs y Cavium's Trueno X2 Los SoC también incluyen procesadores ARMv8.x pero sin aarch32
apoyo.
Para encontrar la arquitectura del dispositivo, podemos leer /proc/cpuinfo
que expone información de Registro de identificación principal del procesador.
~$ cat /proc/cpuinfo
...
CPU implementer : 0x41
CPU architecture: 8
...
CPU part : 0xd03
...
Hardware : Qualcomm Technologies, Inc MSM8953
Pero no hay información directa como lm
para confirmar la compatibilidad con 32/64 bits. Por lo tanto, necesitamos obtener los detalles técnicos del hardware. Según el requisitos de Google, CPU architecture: 8
indica que es un ARMv8
dispositivo. Ver también este compromiso . Y aquí es el mapa de decodificación legible en hexadecimal que lscpu
utiliza el comando.
~$ lscpu | grep -E 'Vendor |Model '
Vendor ID: ARM
Model name: Cortex-A53
Otras formas posibles de obtener información sobre el SoC:
~$ cat /sys/firmware/devicetree/base/model
Qualcomm Technologies, Inc. MSM8953 + PMI8950 QRD SKU3
~$ cat /sys/devices/soc0/{vendor,family,machine}
Qualcomm
Snapdragon
MSM8953
Las especificaciones técnicas del Qualcomm Snapdragon 625 ( MSM 8953 ) y Cortex-53 que se basa en la arquitectura ARMv8, que puede procesar ambos conjuntos de instrucciones: aarch64
y aarch32
.
LA BITÁCORA DEL KERNEL
Cuando arm64
apoyo fue Añadido: al kernel de Linux, también se incluyó el modo de compatibilidad de 32 bits. Si el kernel se construye con IKCONFIG_PROC
Confirmar por:
~# 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
Así, los archivos ELF de 64 bits se ejecutan de forma nativa con binfmt_elf mientras que los archivos ELF de 32 bits se ejecutan con compat_binfmt_elf . Ver detalles en esta respuesta.) .
Por lo general, uname -m
se utiliza para encontrar la arquitectura del dispositivo soportado por el kernel. Muestra la persoanlidad ( dominio de ejecución ) del proceso que por defecto es la arquitectura primaria del kernel ( PER_LINUX
). Pero el kernel de Linux soporta el cambio de persoanlidad Por lo tanto, este enfoque puede ser confuso:
~$ uname -m
aarch64
~$ setarch linux32 uname -m
armv8l
En este último comando uname
se ejecuta en 32 bits personalidad compatible . Lo mismo ocurriría si se utiliza alguna aplicación - como este - que corre con LINUX32
personalidad, no importa si el núcleo y uname
Los binarios son de 64 bits. Para más detalles, consulte este y este . lscpu
también confirma los modos de funcionamiento de la CPU con el mismo fenómeno.
CÓDIGO DE USO BITNESS
Ahora vamos al espacio del usuario, init
es el primer proceso ejecutado por el kernel. Comprobemos su bitness. Si el 5º byte es 1 es un archivo ELF de 32 bits, si es 2 el binario es de 64 bits:
~# hexdump -n5 /proc/1/exe
0000000 457f 464c 0002
O utilice file
comando:
~# file /proc/1/exe
/proc/1/exe: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked ...
De la misma manera, compruebe el nivel de bits de otros binarios/bibliotecas vitales del sistema operativo:
~$ 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 ...
El sistema operativo mantiene bibliotecas de 64 y 32 bits y un enlazador dinámico porque las aplicaciones pueden contener ambos tipos de código binario (aunque la mayor parte debe ser bytecode de Java/Dalvik). Por ejemplo, el dnsmasq
que sirve de servidor DHCP en el hotspot es un binario de 64 bits, mientras que Google Play Services utiliza una biblioteca de 32 bits:
~# 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]
Del mismo modo, no es raro tener bloques binarios de 32 bits de los fabricantes de equipos originales / vendedores de SoC en ROMs de 64 bits. Incluso algunos componentes básicos de AOSP no son compatibles con los 64 bits. Tomemos el ejemplo de audioserver
.
Para ver todos los procesos que se ejecutan en modo de 32 bits:
~# 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
De éstas, sólo una es una aplicación VPN, el resto son procesos del sistema operativo.
CONCLUSIÓN
Así que está claro que, aunque el núcleo del sistema operativo sea de 64 bits, es posible que haya un gran número de procesos que se ejecuten como de 32 bits, aunque cada proceso y sus bibliotecas enlazadas tienen que ser homogéneos; ya sea de 32 o de 64 bits. Y no hay ninguna restricción si el SO no incluye código de 64 bits, pero no se encontrarán muchos casos porque los OEM envían dispositivos de 64 bits con código binario de 64 bits. Se trata más de una cuestión de negocio que de rendimiento; eso es lo que paga el usuario. Sin embargo, existen excepciones en las que el negocio no está tan involucrado: La Raspberry Pi 3 tiene una CPU de 64 bits, pero un sistema operativo Raspbian de 32 bits . Algunos ejemplos de teléfonos Android del pasado son el Galaxy E5, el LG G Stylo, el Moto G5 Plus, el Lenovo A6000 Plus y los dispositivos MT6735. Pero ahora Android es moviendo hacia los 64 bits y algunos dispositivos pueden gota a gota Soporte de 32 bits gradualmente.
¿Sucede lo mismo con Android? ¿Hay una versión de 32 bits y otra de 64 bits para el mismo dispositivo de 64 bits?
Sí, toma el ejemplo de Moto G4 Plus .
RELACIONADO: Aplicaciones Android para arquitectura "armeabi-v7a" y "x86": SoC vs. Procesador vs. ABI