Quel langage de programmation est utilisé pour écrire un programme BIOS?

65

Si j'ai bien compris, le code BIOS / bitstream contenu dans la ROM doit être générique (fonctionne avec plusieurs types de CPU ou ISA). En outre, j'ai vu mentionné sur le Web qu'il est possible de vider son code (et de le "désassembler").

Alors, dans quelle langue, jeu d'instructions ou code machine est-il écrit? N'a-t-il pas besoin d'un processeur quelconque pour effectuer ses opérations? Si c'est le cas, j'imagine qu'il utilisera le processeur externe, alors comment connaît-il le jeu d'instructions spécifique de celui utilisé?

Peut-être qu'il a un processeur interne?

Réflexion
la source
9
doublon possible de Comment fonctionnent les ordinateurs?
moucher
39
Envoyer des messages en croix est déjà une mauvaise chose, mais lorsque vous vous retrouvez sur le Hot Network Questions dans les deux versions , c’est au-delà de tout ce qui se passe ...
Mason Wheeler
8
"Le code / flux de bits du BIOS contenu dans la ROM doit être générique (fonctionne avec plusieurs types de processeurs ou ISA)." - Je n'ai jamais entendu parler d'un BIOS fonctionnant avec plusieurs ISA. Avez-vous un exemple?
chx
6
As I understand, the BIOS code/bitstream that is held in the ROM should be generic (work alongside with multiple CPU types or ISAs). Je dirais "non, au contraire"
edc65
11
Ce n’est même pas à distance une copie d’une question aussi générale que "Comment fonctionnent les ordinateurs?". S'il vous plaît ne fermez pas comme dupe.
Andres F.

Réponses:

103

Auparavant, les BIOS étaient écrits exclusivement en langage assembleur, mais la transition a été faite il y a longtemps pour écrire la majorité du code dans un langage de niveau supérieur, et laisser l’écriture en assemblage aussi peu que possible, de préférence uniquement le bootstrapper, (les toutes premières centaines d’instructions auxquelles le processeur doit accéder après un démarrage / une réinitialisation), et quelles que soient les routines qui traitent des particularités de l’architecture sous-jacente.

Les BIOS étaient déjà écrits principalement en C dès le début des années quatre-vingt-dix. (J'ai écrit un BIOS à 90% de C et à 10% d'assemblage au début des années 90).

Ce qui a également beaucoup aidé dans cette direction est:

  • Les bibliothèques C qui ciblent une architecture spécifique et incluent des fonctions permettant de traiter les particularités de cette architecture, par exemple, des fonctions permettant de lire / écrire des octets vers / à partir des ports d’E / S de l’architecture x86. Microsoft C a toujours proposé des fonctions de bibliothèque pour ce genre de choses.

  • Les compilateurs C qui non seulement s’adressent à une architecture de processeur spécifique mais offrent même des extensions du langage C que vous pouvez utiliser pour écrire du code utilisant des fonctionnalités spéciales du processeur. Par exemple, l'architecture x86 prend en charge des opérations appelées interruptions, qui invoquent des routines appelées gestionnaires d'interruption, et les oblige à disposer de séquences d'instructions d'entrée / de sortie spéciales. Dès le début, Microsoft C a pris en charge des mots-clés spéciaux que vous pouviez utiliser pour marquer une fonction en tant que gestionnaire d'interruptions, afin qu'elle puisse être invoquée directement par une interruption de la CPU, vous n'avez donc pas à écrire d'assembly pour cela.

Aujourd'hui, je suppose que la majeure partie du BIOS est écrite en C ++, si ce n'est dans un langage de niveau supérieur.

La grande majorité du code constituant un BIOS est spécifique au matériel sous-jacent. Il n’est donc pas vraiment nécessaire de le rendre portable: il est garanti qu’il fonctionnera toujours sur le même type de CPU. Le processeur peut évoluer, mais tant qu'il maintient une compatibilité ascendante avec les versions précédentes, il peut toujours exécuter le BIOS sans modification. De plus, vous pouvez toujours recompiler les parties du BIOS écrites en C pour les exécuter en mode natif sur tout nouveau processeur qui se présente, le cas échéant.

La raison pour laquelle nous écrivons des BIOS dans des langues de niveau supérieur à l’assemblage est qu’il est plus facile de les écrire de cette façon, et non pas parce qu’ils ont vraiment besoin d’être portables.

Mike Nakis
la source
7
Oui. Parfois, vous pouvez même avoir une carte mère liée non seulement à une architecture de processeur spécifique, mais même à un fournisseur de processeur spécifique. De nos jours, vous pouvez acheter une carte mère x86 compatible uniquement avec les processeurs Intel x86, ou une carte mère x86 compatible uniquement avec les processeurs AMD x86. Le BIOS de ces cartes mères sera dans une large mesure identique, car dans les deux cas, le processeur comprend le jeu d’instructions x86, et la plupart des périphériques sont identiques, mais certains périphériques ont des différences que le BIOS doit prendre en compte.
Mike Nakis
4
@Reflection examine de près à quoi ressemble physiquement une carte mère. Le socket du processeur aura un certain arrangement de broches, qui est spécifique à la famille de CPU qu’il accepte. Vous ne pouvez pas physiquement connecter un Intel P4 à une carte mère AMD Opteron
Caleth
14
Le terme "BIOS" fait référence au "système d'entrée / sortie de base" d'un PC. Ainsi, un BIOS implique un processeur x86. Les systèmes IA64 ont un EFI au lieu d'un BIOS, les systèmes PowerPC peuvent avoir un système Open Firmware ou un système propriétaire, les systèmes Sparc ont également OFW (ou plutôt OpenBoot), OLPC X0 est un système x86 utilisant OFW. Même les PC n’utilisent plus le BIOS, ils sont passés à (U) EFI. OB / OFW est intéressant, car il est conçu pour être non seulement portable, mais multiplate-forme. Les pilotes OFW fonctionnent sur n’importe quel système OFW, ils sont "Write Once Run Anywhere", quel que soit le processeur ISA.
Jörg W Mittag le
14
"Aujourd'hui, je suppose que la plupart du BIOS est écrit en C ++" Je ne le supposerais pas forcément. Cela peut être vrai, mais je travaille dans ce secteur et de nombreux chargeurs de démarrage sont écrits en clair C. Les personnes qui écrivent ce type La «vieille garde» est souvent l’une des choses qui ont tendance à ne pas encore faire totalement confiance à C ++.
Sam
6
@TomDworzanski: Bien que ce ne soit techniquement pas le BIOS (qui fait exclusivement référence au vieux PC-truc de 1981), de nombreuses implémentations du microprogramme ouvert IEEE-1275 (utilisé pour un rôle similaire au BIOS sur Sparc, la plate-forme de référence pour le matériel informatique commun PowerPC (par exemple)), PowerMac, PowerBook), les 100 $ ordinateurs portables OLPC X0-1) sont écrits en partie dans des langues autres que l'assembly / C. OpenBoot , Open Firmware , OpenBIOS contiennent tous…
Jörg W Mittag
11

Alors qu'en théorie on peut écrire le BIOS dans n’importe quelle langue, la réalité moderne est que la plupart du BIOS est écrit en utilisant Assembly, C, ou une combinaison des deux .

Le BIOS doit être écrit dans un langage capable de compiler en code machine , qui est compris par la machine matérielle physique. Cela élimine les langages interprétés directement ou intermédiaires (Perl, Python, PHP, Ruby, Java, C #, JavaScript, etc.) comme étant appropriés pour l'écriture de BIOS. (Bien que, théoriquement, on puisse implémenter l’un de ces langages pour compiler directement en code machine statique ou intégrer l’interpréteur dans le BIOS. Il existe, par exemple, le projet abandonware GCJ pour Java.)

La plupart des constructeurs implémentent un BIOS en étendant des implémentations de BIOS génériques propriétaires par des sociétés telles que American Megatrends et Phoenix Techologies . (Vous avez probablement déjà vu une de ces sociétés affichée sur le premier écran de démarrage d'un ordinateur.) Le code source de ces implémentations n'est pas publiquement disponible, mais certaines d'entre elles ont été divulguées. Je ne veux pas faire un lien direct avec le code source de C et de l'assembly, mais il existe des endroits sur Internet où ce code source est discuté pour ceux qui veulent regarder.

Certains fabricants de matériel, comme ceux ciblant les marchés des hautes performances et du jeu, saturent leurs implémentations de BIOS avec des fonctionnalités de personnalisation, des statistiques et des interfaces utilisateur attrayantes conçues pour leurs mises en œuvre exactes. Bon nombre de ces caractéristiques vont au-delà de ce que proposent les produits génériques produits par American Megatrends et d’autres. Malheureusement, ces sociétés voient souvent dans la publication de leur code source un risque pour la sécurité . Par conséquent, on sait peu de choses sur ces implémentations haut de gamme car elles sont peu partagées. On pourrait bien sûr trouver des moyens d’accéder à de telles implémentations du BIOS et de les décompiler, mais cela peut être difficile et peut-être illégal.

Pour revenir à la question initiale, en raison de la nécessité de produire du code machine natif, un BIOS devrait être implémenté dans un langage de programmation pris en charge par un compilateur de code machine natif . Bien qu'il existe de nombreux langages de ce type et que, bien que je sois sûr, au cours des dernières décennies, plusieurs langages aient été utilisés à des fins d'expérimentation, chaque implémentation de BIOS ouvert que j'ai pu trouver repose spécifiquement sur une combinaison de C et / ou d'assemblage. Les implémentations de BIOS à source ouverte que j'ai examinées pour formuler cette conclusion incluent OpenBIOS , tinyBIOS , coreboot , Intel BIOS et Libreboot.. J'ai également examiné de très anciennes implémentations de BIOS qui ne sont pas pertinentes aujourd'hui, mais qui respectaient également la règle C et / ou d'assemblage.

Je pense qu'il est également pertinent d'examiner d'autres logiciels conçus pour interagir directement avec le matériel. Nous savons, par exemple, que le noyau Linux , le noyau OS X et le noyau Windows sont en grande partie en C avec un assemblage et des langages de niveau supérieur pour des tâches spécifiques. Nous savons également que les pilotes de matériel sous Linux et Windows sont en grande partie écrits en C.

Pour revenir au BIOS, je pense qu’il est également important de considérer les aspects économiques du langage de programmation choisi. Le BIOS est généralement écrit comme une nécessité pour compléter les ventes de matériel. Les systèmes de BIOS modernes sont connus pour être écrits en grande partie en C et / ou en assembleur. Le passage à un autre outil ajouterait des coûts importants à ce que l’on considère généralement comme des produits de base, ce qui pourrait avoir un effet très négatif sur les ventes. Sans entrer dans Economics 101, je peux vous assurer que cela ne vaut probablement pas la peine pour un OEM de déroger aux outils éprouvés qui ont fait leurs preuves depuis des décennies.

Il y a bien sûr et il y aura des projets d'amateurs d'écriture de BIOS également. Celles-ci aussi, jusqu'à présent, semblent choisir C et / ou l'assemblage. Peut-être qu'un jour d'autres technologies seront utilisées. Mais aujourd'hui, le choix de est bien défini.

Rich Smith
la source
4
Il s’agit d’un peu exaltant, mais C # et Java ne sont pas interprétés. Ils compilent en code octet. C'est le code d'octet qui est ensuite géré par un interprète. Ne change pas la logique du premier paragraphe.
Tonny
1
@ Tonny C'est correct. J'ai ajouté "interprété directement ou intermédiaire" pour être un peu plus clair.
@Tonny normalement une gigue plutôt qu'un interprète, ce qui est une distinction importante car il est possible de tout pré-maîtriser en natif tant que certaines techniques dynamiques ne sont pas utilisées. En tant que tel, il serait théoriquement pratiquement possible d'écrire un BIOS en langage .NET ou en Java, à condition de le faire en même temps et de s'assurer que tout le support nécessaire à l'exécution était disponible. J'imagine que les efforts en ce sens seraient plus que neutres si la commodité était trouvée.
Jon Hanna
1
@Tonny En fait, C # compile en code natif msdn.microsoft.com/en-us/vstudio/dotnetnative.aspx , il est donc étrange de le voir dans la liste des langages faibles / dynamiques.
Den
@ Den C # n'est généralement pas compilé en code natif. Ce produit .Net Native auquel vous créez un lien n'a pas encore été officiellement publié. D'après ce que j'ai lu, le code de l'application et le code d'infrastructure requis seront compilés en un exécutable. Selon la FAQ, cela visera initialement les applications du Windows Store. Il faudra donc un certain temps pour que cela soit pris en charge plus largement. Cela dit, il semble que Microsoft pourrait s’éloigner du modèle de la machine virtuelle dans le futur si tout se passe bien.
4

Le BIOS réel d'un ordinateur serait écrit dans un langage (probablement C ou un assemblage) compilé dans un code binaire dépendant de l'architecture; ce code ne peut pas être exécuté sur une autre architecture (et ne doit pas forcément en avoir besoin, car il est déjà très spécifique à la machine avec laquelle il est livré).

Mais pensez-vous éventuellement aux ROM d’options (qui sont parfois appelées BIOS, comme dans "BIOS vidéo" pour une ROM optionnelle de GPU)?

Pour les ROM d’option existantes, compatibles avec le BIOS, il s’agirait probablement d’un code exécutable dépendant d’ISA (à nouveau généré par n’importe quel langage pouvant être compilé pour cibler l’architecture souhaitée); PCI permet également d' inclure du code pour plusieurs ISA et permet à l'hôte de sélectionner l'image binaire appropriée pendant le processus de démarrage.

Pour les ROM optionnelles compatibles UEFI, il existe également un format de code octet indépendant de l'architecture qui peut être exécuté sur différentes architectures, mais le code dépendant de l'ISA peut également être utilisé.

lxgr
la source