GNU/Linux >> Tutoriales Linux >  >> Linux

Diferencia entre el tamaño de los binarios - x86_64 vs ARM

En cuanto al código del núcleo, además del código específico de la arquitectura, que es una porción muy pequeña (¿1% a 5%?), todo el código fuente del núcleo es común a todas las arquitecturas.

Sobre los binarios:

En realidad, en la mayoría de las distribuciones de Linux, vmlinuz es un enlace simbólico que apunta al código del kernel comprimido con gzip; como vmlinuz-3.16.0-4-amd64 . Estoy seguro de que el OP está hablando de lo último, sin embargo, menciona lo primero para el beneficio del lector.

https://www.ibm.com/developerworks/community/blogs/mhhaque/entry/anatomy_of_the_initrd_and_vmlinuz

Si bien es cierto que el código ARM es más pequeño, incluso si los núcleos no estaban comprimidos, los códigos del núcleo en ARM a menudo están hechos a medida y tienen mucho menos código activado que en las versiones equivalentes de Intel (por ejemplo, Intel tiene muchos tarjetas de video, incluso si solo son los stubs de los módulos, mientras que, por lo general, el kernel ARM personalizado solo tiene que lidiar con el que está presente en el SoC).

Además, es posible que la comparación de blobs binarios aleatorios ya comprimidos no produzca siempre los resultados verdaderos, ya que por alguna extraña coincidencia, un binario más grande podría volverse más pequeño debido a alguna optimización de compresión.

Entonces, en realidad, para comparar efectivamente los núcleos binarios, debe compilarlos con opciones idénticas y mantenerlos sin comprimir (o descomprimir el vmlinuzxxx resultante archivo).

Una coincidencia justa sería comparar otros binarios no comprimidos, por ejemplo, /bin/ls , o /usr/sbin/tcpdump , y además una arquitectura similar a la que estamos tratando de igualar (las máquinas ARM todavía son en su mayoría de 32 bits, sin embargo, ya hay algunas de 64 bits)

No hace falta decir que el mismo código compilado en ARM siempre será (mucho) más pequeño porque el código de máquina ARM es un código de plataforma RISC. También tiene un subconjunto más pequeño de instrucciones de código de máquina, que dan como resultado un código más pequeño. Por otro lado, Intel tiene un conjunto de instrucciones más grande, también debido a la herencia de retrocompatibilidad con múltiples generaciones de microprocesadores.

De http://www.decryptedtech.com/editorials/intel-vs-arm-risc-against-cisc-all-over-again

El concepto de la CPU RISC es antiguo y también es muy eficiente. En las CPU RISC, cada instrucción ejecuta cargas de trabajo más pequeñas, estas instrucciones también se dividen muy a menudo en E / S y memoria para eliminar aún más la sobrecarga. Esto hace que el uso de la CPU y el tiempo de la memoria sea muy eficiente, pero también puede requerir algo de código voluminoso en el lado del software para que todo funcione. Cuando se desarrolló RISC por primera vez, era el camino a seguir simplemente porque el acceso a la memoria y al HDD era lento. Las instrucciones voluminosas y complejas que se encuentran en una CPU x86 eran engorrosas en las CPU más antiguas y no podían seguir el ritmo de los sistemas RISC.

Sin embargo, la conversación no es lo suficientemente clara, ya que los chips Intel son una bestia compleja hoy en día, y en el fondo de la capa pseudo-CISC tienen estrategias y diseños RISC que decodifican y emulan los códigos de operación de Intel tal como los conocemos.

Los códigos de operación ARM también son voluminosos, en comparación con un MIPS, ya que ARM es un procesador económico con instrucciones especializadas dedicadas a la decodificación de video (alrededor del 30 % del chip del procesador está dedicado a ellos).

Como breve ejercicio, tome el binario tcpdump y las cuatro arquitecturas Linux a las que tengo acceso:

MIPS 32 bits -> 502.4K
ARM 32 bits -> 718K
Intel 32 bits (i386) -> 983K
Intel 64 bits (x86_64) -> 1,1 millones

Volviendo a tu pregunta original:

  • Los núcleos ARM "crecen" menos en tamaño porque la arquitectura tiene menos diversidad en el hardware base para una distribución específica.
  • Sin embargo, y mucho más importante, crecen menos en tamaño porque el código producido es más eficiente y compacto.

Los núcleos "binarios" (vmlinuz más o menos) son una pequeña extensión de código que descomprime el resto del núcleo comprimido propiamente dicho. Tienen tanto en común que una gran parte del inicio del archivo es el mismo (por lo que se comprime al mismo).

Diferencias en tamaño de los archivos fuente es bastante irrelevante, la mayoría de los cambios de una versión a la siguiente son líneas cambiadas y nuevos controladores agregados (y los controladores no aparecen en el kernel binario, se usan solo en algunas máquinas y, por lo tanto, generalmente son módulos externos).


Linux
  1. ¿Diferencia entre Shell de inicio de sesión y Shell sin inicio de sesión?

  2. ¿Diferencia entre 2>&-, 2>/dev/null, |&, &>/dev/null y>/dev/null 2>&1?

  3. ¿Cuál es la diferencia entre Sudo Su y Sudo Su?

  4. ¿Diferencia entre Eot y Eof?

  5. ¿Diferencia de cálculo de tamaño de directorio?

Explicación de la diferencia entre apt y apt-get

¿Diferencia entre el tamaño del bloque y el tamaño del clúster?

¿La diferencia entre Nss y Pam?

¿Diferencia entre CLOCK_REALTIME y CLOCK_MONOTONIC?

¿Diferencia entre $HOME y '~' (tilde)?

diferencia entre netstat y ss en linux?