Si je comprends bien, le code BIOS/bitstream qui se trouve dans le ROM devrait être générique (travailler 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émonter").
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 oui, je suppose 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?
Les BIOS étaient écrits exclusivement en langage assembleur, mais la transition a été effectuée il y a longtemps pour écrire la majorité du code dans un langage de niveau supérieur et laisser l'écrit dans l'assembly aussi peu que possible, de préférence uniquement le bootstrapper, (les toutes premières centaines d'instructions auxquelles le CPU passe après un démarrage/réinitialisation), et quelles que soient les routines traitant des particularités spécifiques de l'architecture sous-jacente.
Les BIOS étaient déjà écrits principalement en C dès le début des années 90. (J'ai écrit un BIOS à 90% C, 10% d'assemblage au début des années 90.)
Ce qui a également beaucoup aidé dans cette direction, c'est:
Bibliothèques C qui ciblent une architecture spécifique et incluent des fonctions pour traiter les particularités de cette architecture, par exemple, des fonctions de lecture/écriture d'octets vers/depuis les ports d'E/S de l'architecture x86. Microsoft C a toujours offert des fonctions de bibliothèque pour ce genre de choses.
Les compilateurs C qui ciblent non seulement une architecture CPU spécifique mais offrent même des extensions au langage C que vous pouvez utiliser pour écrire du code qui utilise des fonctionnalités CPU spéciales. Par exemple, l'architecture x86 prend en charge des éléments appelés interruptions, qui invoquent des routines appelées gestionnaires d'interruptions, et elle requiert qu'ils aient des séquences d'instructions d'entrée/sortie spéciales. Dès les premiers jours, 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'interruption, de sorte qu'elle pouvait être invoquée directement par une interruption du processeur, vous n'avez donc pas eu à écrire d'assembly pour elle.
De nos jours, je suppose que la plupart du BIOS est écrit en C++, sinon dans un langage de niveau supérieur.
La grande majorité du code qui compose un BIOS est spécifique au matériel sous-jacent, il n'a donc pas vraiment besoin d'être portable: il est garanti qu'il fonctionnera toujours sur le même type de CPU. Le CPU peut évoluer, mais tant qu'il conserve la compatibilité descendante 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 qu'elles s'exécutent en mode natif sur tout nouveau processeur qui arrive, si le besoin s'en fait sentir.
La raison pour laquelle nous écrivons des BIOS dans des langues d'un niveau supérieur à Assembly est qu'il est plus facile de les écrire de cette façon, et non parce qu'ils doivent vraiment être portables.
Alors qu'en théorie on peut écrire le BIOS dans n'importe quelle langue, la réalité moderne est la plupart des BIOS sont écrits en utilisant Assembly, C, ou une combinaison des deux .
Le BIOS doit être écrit dans un langage pouvant être compilé en code machine , qui est compris par la machine matérielle physique. Cela élimine les langages interprétés directement ou de manière intermédiaire (Perl, Python, PHP, Ruby, Java, C #, JavaScript, etc.) comme étant appropriés pour écrire le BIOS. (Bien que, en théorie, on puisse implémenter l'un de ces langages pour compiler directement en code machine statique ou on pourrait en quelque sorte intégrer l'interpréteur dans le BIOS. Il y a, par exemple, le projet GCJ abandonware pour Java.)
La plupart des fabricants OEM implémentent un BIOS en étendant les implémentations génériques propriétaires du BIOS par des sociétés comme 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 accessible au public, mais une partie a été divulguée. Je ne veux pas lier cela directement au code source de C et Assembly, mais il y a endroits sur Internet où ce code source est discuté pour ceux qui veulent jeter un œil.
Certains fabricants de matériel, comme ceux qui ciblent les marchés des jeux et des performances élevées, saturent leurs implémentations du BIOS avec des fonctionnalités de personnalisation, des statistiques et des interfaces utilisateur attrayantes conçues pour leurs implémentations exactes. Beaucoup de ces fonctionnalités vont au-delà de ce qui est offert dans les produits génériques produits par American Megatrends et d'autres. Malheureusement, ces entreprises ont souvent voir la publication de leur code source comme un risque pour la sécurité , si peu de choses sont connues sur ces implémentations haut de gamme car peu de choses sont partagées à leur sujet. On pourrait bien sûr trouver des moyens d'accéder à ces implémentations du BIOS et de les décompiler, mais cela peut être difficile et peut-être illégal.
Pour revenir à la question d'origine, en raison de la nécessité de produire du code machine natif, un BIOS devrait être implémenté dans n langage de programmation pris en charge par un compilateur de code machine natif . Bien qu'il existe de nombreux langages de ce type et bien que je sois sûr au cours des dernières décennies, plusieurs langages ont été utilisés dans l'expérimentation, chaque implémentation de BIOS ouverte que j'ai pu trouver repose spécifiquement sur une combinaison de C et/ou d'assemblage. Les implémentations de BIOS open source que j'ai examinées pour formuler cette conclusion incluent OpenBIOS , tinyBIOS , coreboot , Intel BIOS , et Libreboot . J'ai également examiné quelques implémentations de BIOS très anciennes qui ne sont pas pertinentes aujourd'hui, mais ont également suivi la règle C et/ou Assembly.
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 Linux Kernel , le OS X kernel , et le Windows kernel sont en grande partie C avec un certain Assembly et certains plus élevés langues de niveau pour des tâches spécifiques. Nous savons également que pilotes matériels sous Linux et pilotes matériels sous Windows sont écrits en grande partie en C.
Pour en revenir au BIOS, je pense qu'il est également important de considérer l'économie 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 BIOS modernes sont connus pour être largement écrits en C et/ou en assembleur. Le passage à un autre outil entraînerait des coûts importants pour ce qui est généralement considéré 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 s'écarter des outils éprouvés qui ont fait leurs preuves depuis des décennies.
Bien sûr, il existe et il y aura des projets d'amateur pour écrire le BIOS également. Jusqu'à présent, ces derniers semblent également choisir C et/ou Assembly. Peut-être qu'un jour d'autres technologies seront utilisées. Mais aujourd'hui, le choix de est bien défini.
Le BIOS réel d'un ordinateur serait écrit dans un langage (probablement C ou Assembly) qui est compilé en code binaire dépendant de l'architecture; ce code ne peut pas fonctionner sur une autre architecture (et sans doute pas vraiment nécessaire, car il est déjà très spécifique à la machine avec laquelle il est livré).
Mais pensez-vous peut-être à ROM optionnelles (qui sont parfois appelées BIOS, comme dans "BIOS vidéo" pour une ROM optionnelle GPU)?
Pour les ROM optionnelles compatibles avec le BIOS, elles seraient probablement ISA code exécutable dépendant (généré à nouveau par n'importe quel langage pouvant être compilé pour cibler l'architecture souhaitée); PCI également permet y compris le 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 d'octet indépendant de l'architecture qui peut être exécuté sur différentes architectures, mais le code dépendant d'ISA peut également être utilisé.