Question:
Quel jeu d'instructions est utilisé sur la puce ARM / Broadcom du Pi?
smeeb
2015-05-16 00:16:53 UTC
view on stackexchange narkive permalink

J'essaie de déterminer quel jeu d'instructions (x86_64, IA-32, etc.) est utilisé par la puce Broadcom du RPi (en fait un ARM 1176JZF-S), car j'aimerais comprendre comment linux peut fonctionner dessus.

D'après ce que je comprends, Linux (Raspbian, Debian, Ubuntu, etc.) est compilé via gcc qui utilise le jeu d'instructions x86_64.

Donc, à moins que cette puce ARM ne supporte le jeu d'instructions x86_64, je n'ai aucune idée de la façon dont le RPi peut même exécuter Linux! Des pensées?

Vous savez qu'un rapide voyage sur wikipedia aurait pu dissiper certaines de ces illusions. ;)
Et le jeu d'instructions, si je comprends bien, est une version de RISC http://infocenter.arm.com/help/topic/com.arm.doc.ddi0301h/Caccebch.html
Quatre réponses:
Jacobm001
2015-05-16 00:40:01 UTC
view on stackexchange narkive permalink

Vous semblez avoir un malentendu sur la manière dont les logiciels sont compilés. Linux est essentiellement un logiciel géant écrit dans le langage de programmation C.

L'un des principaux avantages de l'écriture de logiciel dans un langage de niveau supérieur à l'assemblage est qu'il permet d'écrire le logiciel indépendamment de l'architecture du processeur. Le même code (écrit en C) peut être compilé pour plusieurs types d'architecture.

Si vous tapez gcc dans le terminal de votre RPi, vous verrez qu'il y est installé. Pour voir le compilateur en action, utilisez le tutoriel "hello world" ci-dessous et compilez-le avec l'indicateur -S à la fois sur un PC x86 et le RPi. Si vous comparez les deux, vous verrez que la sortie de l'assembly est considérablement différente, même si les deux sorties ont été produites par le même code C. Le système d'exploitation Linux fonctionne de la même manière.

Exemple de code C:

  #include <stdio .h> # include <stdlib.h>int main (int argc, char * argv []) {printf ("Hello, World! \ n"); exit (EXIT_SUCCESS);}  

Sortie gcc -S sur un Xeon (x86-64):

  .file" hello.c ".section .rodata.LC0: .string" Hello, World! " .text .globl main .type main, @functionmain: .LFB2: .cfi_startproc pushq% rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq% rsp,% rbp .cfi_def_cfa_register 6 sousq 16 $,% r-movl% edi % rbp) movq% rsi, -16 (% rbp) movl $ .LC0, l'appel% edi met movl $ 0, l'appel% edi exit .cfi_endproc.LFE2: .size main,.-main .ident "GCC: (Ubuntu 5.4. 0-6ubuntu1 ~ 16.04.1) 5.4.0 20160609 ".section .note.GNU-stack," ", @ progbits  

Sortie gcc -S sur un Raspberry Pi 2 (Cortex-A7):

  .arch armv6 .eabi_attribute 27, 3 .eabi_attribute 28, 1 .fpu vfp .eabi_attribute 20, 1 .eabi_attribute 21, 1 .eabi_attribute 23, 3 .eabi_attribute 24 , 1 .eabi_attribute 25, 1 .eabi_attribute 26, 2 .eabi_attribute 30, 6 .eabi_attribute 34, 1 .eabi_attribute 18, 4 .file "hello.c" .section .rodata .align 2.LC0: .ascii "Hello, World ! \ 000 ".text .align 2 .global main .type main,% functionmain: @ args = 0, feint = 0, frame = 8 @ frame_needed = 1, uses_anonymous_args = 0 stmfd sp !, {fp, lr} add fp , sp, # 4 sous sp, sp, # 8 str r0, [fp, # -8] str r1, [fp, # -12] ldr r0, .L2 bl met mov r0, # 0 bl exit.L3:. align 2.L2: .word .LC0 .size main,.-main .ident "GCC: (Raspbian 4.9.2-10) 4.9.2" .section .note.GNU-stack, "",% progbits  
Merci @Jacobm001 (+1) mais je pense que vous avez complètement manqué ma question. Je sais ce qu'est un compilateur (bien que je sois un gars Java, pas un gars C), et je crois comprendre que les distributions Linux sont généralement compilées via `gcc` ciblant le jeu d'instructions x86_64. Ai-je manqué quelque chose?
Oui, ils sont généralement compilés pour x86, mais rien n'empêche quelqu'un de prendre le code et de le compiler lui-même et de cibler une architecture différente. Pour créer Raspbian, la fondation RPi a essentiellement pris le code source de Debian, l'a peaufiné et l'a compilé en ciblant la plate-forme ARM6.
goldilocks
2015-05-16 00:32:45 UTC
view on stackexchange narkive permalink

GCC est un compilateur multiplateforme ; Je suppose qu'il est utilisé sur plus d'architectures que tout autre compilateur contemporain - pas seulement x86_64 (qui est plus.

Le noyau Linux est également très portable, ce qui est une raison majeure de son succès et pourquoi il est utilisé sur les pis armv6j pre-2, et d'ailleurs sur les armv7 pi 2.

La base de l'espace utilisateur GNU sur une distribution GNU / Linux est généralement glibc ( ou son proche jumeau, eglibc), aussi portable que le noyau et GCC, c'est pourquoi GNU / Linux est le système d'exploitation le plus portable du monde contemporain.

Puce Broadcom (vraiment un ARM 1176JZF -S)

C'est un peu comme dire qu'un processeur i5 est "vraiment un x86_64" (une architecture de jeu d'instructions - ISA - en fait introduite par AMD , pas Intel).

Cela devient un peu déroutant car "ARM 11" (... "76JZF-S") est une conception de cœur de processeur ( architecture du microprocesseur ) implémentant les dernières versions du jeu d’instructions ARMv6. Je crois que est la différence entre l ' architecture de jeu d'instructions de haut niveau et l' architecture de microprocesseur plus spécifique. Le SoC Broadcom utilise cette architecture de microprocesseur, qui implémente le jeu d'instructions ARMv6 (Z).

Raspbian, Debian, Ubuntu,

Distributions GNU / Linux individuelles sont généralement constitués de binaires précompilés, et ceux-ci ont tendance à être plus limités que les possibilités susmentionnées - généralement x86, x86_64, PowerPC (anciens Mac), MIPS, SPARC, ARM. Vous pourriez en lancer un pour toute une série d’autres choses; il y a quelques douzaines d'archives dans les sources du noyau vanilla, et le code source du reste de l'espace utilisateur est accessible au public.

C'est exactement ce qui a été fait pour créer Raspbian, en fait, sauf que le support du BCM2708 a été ajouté au noyau.

Merci @goldilocks (+1) - mais je suis encore un peu confus. Prenez la [page de téléchargements d'Ubuntu] (http://www.ubuntu.com/download/alternative-downloads), par exemple. Nulle part sur cette page je ne vois des téléchargements pour les processeurs ARM, seulement des variantes 32 et 64 bits. Cela signifie-t-il qu'Ubuntu * ne peut pas * fonctionner sur la puce ARM de RPi, ou simplement que j'aurais besoin de «pirater» (recompiler / compiler croisé, etc.) les bibliothèques Ubuntu de base afin de les rendre compatibles RPi / ARM? Merci encore!
Cela a juste à voir avec la façon dont les distributions structurent leurs sites Web, je pense. Par exemple, il existe deux distributions Ubuntu ARMv7 utilisées sur le Pi 2, "Snappy Core" (qui est poussé par la fondation et cible les projets intégrés avec un userland en lecture seule) et [plain 'ol ubuntu] (https: // wiki .ubuntu.com / ARM / RaspberryPi). Malheureusement, il faut creuser un peu (par exemple, je cherchais juste pour m'assurer qu'il existe des distributions vraiment traditionnelles pour MIPS et SPARC).
RedGrittyBrick
2015-05-16 02:45:32 UTC
view on stackexchange narkive permalink

Je crois comprendre que Linux (Raspbian, Debian, Ubuntu, etc.) est compilé via gcc

Vrai

qui utilise le jeu d'instructions x86_64.

Ce n'est pas limité à cela, gcc lui-même peut être compilé sur de nombreuses architectures et sur n'importe laquelle d'entre elles il peut être exécuté pour cibler (produire des exécutables pour) de nombreuses autres architectures différentes (y compris de nombreux jeux d'instructions différents)

À titre d'exemple, voir Images d'installation Debian, qui répertorie

Voici des fichiers image d'une taille maximale de 280 Mo. Choisissez votre architecture de processeur ci-dessous.

  • amd64
  • arm64
  • armel
  • armhf
  • i386
  • mips
  • mipsel
  • powerpc
  • ppc64el
  • s390x
bmargulies
2015-05-16 01:31:39 UTC
view on stackexchange narkive permalink

Mon beaglebone black exécute Debian. Il utilisait même Ubuntu. Il est livré avec GCC, déjà tous compilés pour générer du code pour ARM. Le même mécanisme est utilisé pour le Pi, j'ai utilisé l'un de ceux-ci: Voir:

  Debian GNU / Linux 7BeagleBoard.org BeagleBone Debian Image 2014-05-14Support / FAQ: http: / /elinux.org/Beagleboard:BeagleBoneBlack_Debian Dernière connexion: ven 15 mai 01:59:56 2015 de puck.fios-router.homeroot@mmbackup: ~ # gcc -vUtilisation des spécifications intégrées.COLLECT_GCC = gccCOLLECT_LTO_WRAPPER = / usr / lib / gcc /arm-linux-gnueabihf/4.6/lto-wrapperTarget: arm-linux-gnueabihfConfiguré avec: ../src/configure -v --with-pkgversion = 'Debian 4.6.3-14' --with-bugurl = fichier: ///usr/share/doc/gcc-4.6/README.Bugs --enable-languages ​​= c, c ++, fortran, objc, obj-c ++ --prefix = / usr --program-suffix = -4.6 --enable -shared --enable-linker-build-id --with-system-zlib --libexecdir = / usr / lib --without-included-gettext --enable-threads = posix --with-gxx-include-dir = /usr/include/c++/4.6 --libdir = / usr / lib --enable-nls --with-sysroot = / --enable-clocale = gnu --enable-libstdcxx-debug --enable-libstdcxx-time = oui --enable-gnu-unique-object --enable-plugin --enable-obj c-gc --disable-sjlj-exceptions --with-arch = armv7-a --with-fpu = vfpv3-d16 --with-float = hard --with-mode = thumb --enable-checking = release - -build = arm-linux-gnueabihf --host = arm-linux-gnueabihf --target = arm-linux-gnueabihf Modèle de fil: posixgcc version 4.6.3 (Debian 4.6.3-14) root @ mmbackup: ~ #  


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...