6 votos

¿Podría un dispositivo de hardware de 64 bits ejecutar una versión de Android de 32 bits?

Esta pregunta proviene de ¿Cómo puedo saber si la versión de Android que tengo instalada, no la CPU, es de 64 bits o de 32 bits?

En los ordenadores de sobremesa es posible instalar un 32 bits sistema operativo en un 64 bits dispositivo de hardware, es decir, puede instalar Ubuntu Linux de 32 bits en un procesador AMD FX(tm)-9370 de ocho núcleos (64 bits).

¿Sucede lo mismo con Android? ¿Existe una 32 bits y una versión de 64 bits para el mismo dispositivo de 64 bits?

Algunos enlaces de ejemplo (como descargas de ROMs en 32 y 64 bits para el mismo dispositivo Android) serían bienvenidos.

4voto

Jack Wade Puntos 231

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:

  1. 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.

  2. 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

0voto

Vinay Balraj Puntos 1

La respuesta es sí. Puedes ejecutar Android de 32 bits en chipsets de 64 bits sin muchos problemas. Pero realmente no debería importar la versión que tengas porque por ahora el 90% de todas las aplicaciones que están disponibles son de 32 bits y no harán uso del hardware de 64 bits.

0 votos

Algunos enlaces de ejemplo serían bienvenidos.

0 votos

Tu afirmación de que el 90% de las aplicaciones son de 32 bits no tiene sentido, dado que la mayoría de las aplicaciones están escritas en Java y, por tanto, son independientes del ISA y del sistema operativo en el que se ejecuten.

0voto

Roh_mish Puntos 11

Sí que puedes. De hecho, algunos de los primeros dispositivos hacían exactamente eso. Es similar a lo que tenemos en el lado de la computación de escritorio. El Moto E2 es un ejemplo de procesador de 64 bits con sistema operativo de 32 bits.

0 votos

Algunos enlaces de ejemplo serían bienvenidos.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X