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?
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"Réponses:
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.
la source
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.
la source
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é.
la source