Voici mes notes résumées incomplètes sur le sujet, mais suffisantes pour répondre à votre question.
JEU D'INSTRUCTIONS :
Les processeurs sont constitués de matrices de semi-conducteurs, généralement du silicium monocristallin de qualité électronique. Ils ne connaissent pas l'anglais ou toute autre langue humaine, ils comprennent seulement 0
y 1
. Le concepteur du processeur nous indique donc dans quelle séquence de zéros et de uns nous pouvons donner des instructions à ce processeur spécifique. Ce langage numérique d'instructions est normalisé comme suit Machine Language
et l'ensemble des instructions machine est appelé Instruction Set
. Un processeur ne peut agir que sur un ou plusieurs types spécifiques de jeu d'instructions.
Les jeux d'instructions peuvent être de 8/16/32/64 bits (définissant le nombre d'instructions qu'un processeur peut traiter à la fois), les deux derniers étant les plus courants de nos jours.
LES LANGAGES DE BAS NIVEAU :
Mais écrire le code du programme (instructions) directement en langage machine (le fichier exécutable) est presque impossible car il faudra des années pour écrire et déboguer un programme de taille raisonnable (que nous pouvons écrire en quelques heures de nos jours). Ainsi, pour mettre les programmeurs à l'aise, le langage d'assemblage a été développé, toujours un langage spécifique au processeur mais relativement facile à comprendre. Le code écrit en langage d'assemblage est converti en code machine par Assembler
- un programme écrit en langage machine. Ces deux langages sont appelés langages de bas niveau.
LES LANGAGES DE HAUT NIVEAU :
Pour réduire encore l'effort humain de communication avec le matériel, des langages de haut niveau ont été développés, qui ne sont pas liés à un jeu d'instructions spécifique (désignant une architecture spécifique). Ils sont identiques aux langages humains, donc faciles à écrire, à comprendre, à déboguer et à appliquer à de multiples architectures. Le code écrit en langage de haut niveau est converti en langage de bas niveau par Compiler
- un programme écrit dans un langage de bas niveau. L'un des langages de haut niveau les plus couramment utilisés est le C. Mais parfois, le code n'est pas précompilé en code machine, mais directement exécuté (ou compilé en cours d'exécution) par Interpreter
. Java est l'un de ces "écrire une fois, courir partout" (WORA) qui est compilé en byte-code
et ensuite interprété par Virtual Machine
- à nouveau un programme compilé.
INTERFACE BINAIRE D'APPLICATION (ABI) :
Étant donné qu'un programme (code) indépendant de l'architecture peut être converti en code dépendant de l'architecture pour n'importe quel processeur, il est du devoir du compilateur de prendre en charge toutes les exigences d'une architecture spécifique. C'est ce que définit l'interface binaire d'application (ABI). En termes simples, une ABI représente une ou plusieurs architectures spécifiques. Pour en savoir plus sur les ABI embarquées, il faut connaître les étapes de l'assemblage et de la compilation, le code objet, le format exécutable et lisible (ELF), la liaison statique (archivage) et dynamique des bibliothèques, etc.
Venons-en maintenant à votre question :
QUELS SONT x86
ET ARM
?
x86 est une famille de jeux d'instructions, principalement développée et fabriquée par Intel et AMD. ARM est une autre famille, conçue par une seule entité ARM Holdings
et dont la licence a été accordée à de nombreux fabricants de solutions embarquées, dont Qualcomm, Mediatek, Samsung et Huawei. Snapdragon, Exynos et Kirin sont leurs noms de marque. Ils ne sont pas des fabricants de processeurs mais ils ont des licences pour inclure les processeurs ARM dans leurs propres circuits System on Chip (SoC).
Qu'est-ce que le SoC ?
Un système sur puce (SoC) est un petit circuit qui comprend des processeurs ainsi que d'autres composants tels que le GPU, la RAM, la mémoire Flash/eMMC (équivalent du disque dur ou du disque SSD), les modules WiFi et Bluetooth, la connectivité USB, les ports série UART, JTAG (un protocole de communication série de très bas niveau), le GPS, les modems (pour la connectivité cellulaire) et éventuellement d'autres.
ARM ABIs :
Bien que la majeure partie des applications Android soient écrites en Java, il est possible de programmer dans des langages natifs comme le C et le C++, qui doivent être compilés. Android fournit son propre kit de développement natif ( NDK ) comprenant (des bibliothèques, des fichiers d'en-tête et) un compilateur pouvant compiler du code pour plusieurs ABI, notamment armeabi-v7a
( armhf
dans la communauté Linux) et x86
.
L'application Android (Java) elle-même n'est pas spécifique à une architecture. Au cours du processus de création de l'application, le SDK Android convertit la source Java en bytecode ( .class
) et le compile ensuite en D alvik EX écutable ( .dex
) qui est emballé avec .apk
fichiers. Ce bytecode Dalvik est interprété et exécuté dans une instance séparée de Dalvik Virtual Machine
/ ART
pour chaque application par un processus nommé Zygote
. Ou bien il peut être compilé de façon permanente en code machine natif ( .odex
o .oat
) en fonction de l'architecture de l'appareil lors de l'installation de l'application (ou de l'abonnement à l'application). plus tard ). Mais si le fichier apk (zip) contient en plus des binaires/bibliothèques ELF, ceux-ci sont spécifiques à l'architecture. Les développeurs incluent généralement des bibliothèques natives pour plusieurs architectures dans leurs applications.
Applications/programmes/binaires/exécutables/bibliothèques natifs construits avec des suites de compilateurs ciblant ARM Embedded ABI v7a
( armeabi-v7a ) peut être exécuté sur Application profile of 7th version of ARM processors
( Armv7-A ).
Code compilé avec chaînes d'outils fournis par d'autres fournisseurs, ciblant la même architecture (bien qu'avec des noms ABI différents) devraient également fonctionner sur les appareils Android.
32 BITS CONTRE 64 BITS :
Le processeur ARM peut être de 32 ou 64 bits. Cela dépend des fabricants de SoC et de ce qu'ils veulent construire avec leur système embarqué, par exemple le Snapdragon peut être 32 ou 64 bits. Les processeurs ARM 32 bits ont été améliorés en termes de performances et de nouvelles capacités ont été ajoutées de la version 2 à la version 7. Le support 64 bits a été introduit dans la version ARMv8.
Pour savoir si un appareil est 32 ou 64 bits, vous devez vérifier les spécifications de son SoC, puis de son processeur. Par exemple, le SoC de Redmi Note 4 es Qualcomm Snapdragon 625 (MSM 8953) qui contient un processeur Cortex-A53
. Il est évident que Spécifications techniques du Cortex-53 que c'est basé sur ARMv8
qui peut traiter 2 types de jeux d'instructions : aarch64
(que le système Android arm64-v8a ABI utilise) et aarch32
(que le système Android armeabi-v7a ABI utilise, c'est-à-dire qu'il est rétrocompatible avec ARMv7
).
Ainsi, il peut exécuter des binaires/bibliothèques compilés pour ces deux ABI, mais pas pour x86 o armeabi
(appelé armel dans la communauté Linux ; qui a ciblé l'architecture ARMv5/v6
et a été supprimé en NDK r17
).
RELATION : Un appareil matériel 64 bits peut-il faire fonctionner une version 32 bits d'Android ?