Mit welcher Programmiersprache wird ein BIOS-Programm geschrieben?

Soweit ich weiß, sollte der im ROM enthaltene BIOS-Code / Bitstream generisch sein (zusammen mit mehreren CPU-Typen oder ISAs arbeiten). Außerdem habe ich im Web erwähnt, dass es möglich ist, seinen Code zu sichern (und zu „zerlegen“).

In welcher Sprache, in welchem Befehlssatz oder in welchem Maschinencode ist er geschrieben? Benötigt es keinen Prozessor, um seine Operationen auszuführen? Wenn ja, denke ich, dass es die externe CPU verwenden wird, woher kennt es dann den spezifischen Befehlssatz des verwendeten?

Vielleicht hat einen internen Prozessor?

Kommentare

  • mögliches Duplikat von Wie funktionieren Computer?
  • Cross-Posting ist schon schlimm genug, aber wenn es in beiden Versionen i auf den Hot Network Questions landet >, dass ‚ direkt hinter dem blassen …
  • “ BIOS-Code / Bitstream, der im Das ROM sollte generisch sein (zusammen mit mehreren CPU-Typen oder ISAs arbeiten). “ – Ich habe noch nie von einem BIOS gehört, das mit mehreren ISAs funktioniert Haben Sie ein Beispiel?
  • As I understand, the BIOS code/bitstream that is held in the ROM should be generic (work alongside with multiple CPU types or ISAs). Ich ‚ würde “ sagen Nein, im Gegenteil “
  • Dies ist nicht einmal eine Remote-Anzeige Aktualisierung einer so allgemeinen Frage wie “ Wie funktionieren Computer? „. Bitte nicht als Dupe schließen.

Antwort

BIOSes wurden früher ausschließlich in Assemblersprache geschrieben, aber die Der Übergang wurde vor langer Zeit durchgeführt, um den größten Teil des Codes in einer höheren Sprache zu schreiben und so wenig Teile wie möglich in Assembly zu schreiben, vorzugsweise nur den Bootstrapper (die ersten paar hundert Anweisungen, die die CPU überspringt) bis nach einem Start / Zurücksetzen) und alle Routinen, die sich mit bestimmten Macken der zugrunde liegenden Architektur befassen.

BIOS wurden bereits in den frühen neunziger Jahren hauptsächlich in C geschrieben. (Ich habe Anfang der neunziger Jahre ein BIOS in 90% C und 10% Assembly geschrieben.)

Was auch in dieser Richtung sehr geholfen hat, ist:

  • C. Bibliotheken, die auf eine bestimmte Architektur abzielen und Funktionen zum Behandeln von Besonderheiten dieser Architektur enthalten, z. B. Funktionen zum Lesen / Schreiben von Bytes zu / von E / A-Ports der x86-Architektur. Microsoft C hat immer Bibliotheksfunktionen für diese Art von Dingen angeboten.

  • C-Compiler, die nicht nur auf eine bestimmte CPU-Architektur abzielen, sondern sogar Erweiterungen der C-Sprache bieten, in der Sie sie verwenden können um Code zu schreiben, der spezielle CPU-Funktionen nutzt. Beispielsweise unterstützt die x86-Architektur sogenannte Interrupts, die Routinen aufrufen, die als Interrupt-Handler bezeichnet werden, und erfordert spezielle Eingangs- / Ausgangsbefehlssequenzen. Microsoft C unterstützte von Anfang an spezielle Schlüsselwörter, mit denen Sie eine Funktion als Interrupt-Handler markieren konnten, sodass sie direkt von einem CPU-Interrupt aufgerufen werden konnte, sodass Sie keine Assembly dafür schreiben mussten. P. >

Heutzutage würde ich annehmen, dass der größte Teil des BIOS in C ++ geschrieben ist, wenn nicht in einer höheren Sprache.

Die überwiegende Mehrheit des Codes, aus dem sich das zusammensetzt Ein BIOS ist spezifisch für die zugrunde liegende Hardware, muss also nicht wirklich portabel sein: Es wird garantiert, dass es immer auf demselben CPU-Typ ausgeführt wird. Die CPU kann sich weiterentwickeln, aber solange sie die Abwärtskompatibilität mit früheren Versionen beibehält, kann das BIOS unverändert ausgeführt werden. Außerdem können Sie die in C geschriebenen Teile des BIOS jederzeit neu kompilieren, damit sie bei Bedarf nativ auf jeder neuen CPU ausgeführt werden können.

Der Grund, warum wir BIOS in Sprachen einer höheren Ebene als schreiben Assembly ist, weil es einfacher ist, sie auf diese Weise zu schreiben, nicht weil sie wirklich portabel sein müssen.

Kommentare

  • Ja. Manchmal ist sogar ein Motherboard nicht nur an eine bestimmte CPU-Architektur gebunden, sondern sogar an einen bestimmten CPU-Anbieter. Heutzutage können Sie ein x86-Motherboard kaufen, das nur mit Intel x86-CPUs kompatibel ist, oder ein x86-Motherboard, das nur mit AMD x86-CPUs kompatibel ist. Das BIOS in diesen Motherboards ist weitgehend identisch, da in beiden Fällen die CPU den x86-Befehlssatz versteht und die meisten Peripheriegeräte identisch sind, einige Peripheriegeräte jedoch Unterschiede aufweisen, die das BIOS berücksichtigen muss.
  • @Reflection Sehen Sie sich genau an, wie ein Motherboard physisch aussieht. Der CPU-Sockel verfügt über eine bestimmte Pin-Anordnung, die für die von ihm akzeptierte CPU-Familie spezifisch ist.Sie können einen Intel P4 physisch nicht mit einem AMD Opteron-Motherboard verbinden.
  • Der Begriff “ BIOS “ bezieht sich auf das “ Grundlegendes Eingabe- / Ausgabesystem “ eines PCs Ein BIOS impliziert also eine x86-CPU. IA64-Systeme haben ein EFI anstelle eines BIOS, PowerPC-Systeme können ein Open Firmware-System oder ein proprietäres System haben, Sparc-Systeme haben auch OFW (oder besser OpenBoot), das OLPC X0 ist ein x86-basiertes System, das OFW verwendet. Selbst PCs, die ‚ kein BIOS mehr verwenden, haben auf (U) EFI umgestellt. OB / OFW ist interessant, weil es nicht nur tragbar, sondern auch plattformübergreifend ist. OFW-Treiber funktionieren auf jedem OFW-System. Sie sind “ Einmal überall ausführen „, unabhängig von der CPU ISA.
  • “ Heutzutage würde ich annehmen, dass der größte Teil des BIOS in C ++ geschrieben ist. “ Ich würde nicht ‚ muss nicht unbedingt davon ausgehen, dass es wahr sein mag, aber ich arbeite in dieser Branche und sicherlich sind viele Bootloader in einfachem C geschrieben. Die Leute, die solche Sachen schreiben, sind oft die “ Alte Garde “ und neigen dazu, C ++ immer noch nicht vollständig zu vertrauen.
  • @TomDworzanski: Obwohl technisch nicht BIOS (das ausschließlich bezieht zu den alten PC-Sachen von 1981), viele Implementierungen der IEEE-1275 Open Firmware (die für eine ähnliche Rolle wie das BIOS auf Sparc, der PowerPC Common Hardware Reference Platform (z. B. PowerMac, PowerBook), dem 100-Dollar-Laptop OLPC X0 verwendet wird -1) sind teilweise in anderen Sprachen als Assembly / C geschrieben. OpenBoot , Firmware öffnen , OpenBIOS alle enthalten…

Antwort

Theoretisch kann man BIOS in jeder Sprache schreiben, die Die moderne Realität ist . Das meiste BIOS wird mit Assembly, C oder einer Kombination der beiden geschrieben.

Das BIOS muss in einer Sprache geschrieben sein, die zu Maschinencode kompiliert werden kann, der von der physischen Hardware-Maschine verstanden wird. Dadurch werden die direkt oder mittelinterpretierten Sprachen (Perl, Python, PHP, Ruby, Java, C #, JavaScript usw.) als für das Schreiben des BIOS geeignet eliminiert. (Theoretisch könnte man jedoch eine dieser Sprachen implementieren, um entweder direkt in statischen Maschinencode zu kompilieren, oder man könnte den Interpreter irgendwie in das BIOS einbetten. Es gibt zum Beispiel die verlassenes GCJ-Projekt für Java.)

Die meisten OEMs implementieren ein BIOS, indem sie proprietäre, generische BIOS-Implementierungen von Unternehmen wie American Megatrends und Phoenix Techologies . (Sie haben wahrscheinlich schon einmal eine dieser Firmen auf dem ersten Startbildschirm eines Computers gesehen.) Der Quellcode für diese Implementierungen ist nicht öffentlich verfügbar, aber ein Teil davon ist durchgesickert. Ich möchte nicht direkt darauf verlinken zum C- und Assembly-Quellcode, aber es gibt Stellen im Internet, an denen dieser Quellcode besprochen wird für diejenigen, die einen Blick darauf werfen möchten.

Einige Hardwarehersteller, wie diejenigen, die auf den Hochleistungs- und Spielemarkt ausgerichtet sind, sättigen ihre BIOS-Implementierungen mit Anpassungsfunktionen, Statistiken und attraktiven Benutzeroberflächen, die für ihre genauen Implementierungen entwickelt wurden. Viele dieser Funktionen gehen über das hinaus, was in den hergestellten generischen Produkten angeboten wird von American Megatrends und anderen. Leider sehen diese Unternehmen die Veröffentlichung ihres Quellcodes häufig als Sicherheitsrisiko an, so dass über diese High-End-Implementierungen wenig bekannt ist, weil Über sie wird wenig geteilt Ich würde natürlich Wege finden, auf solche BIOS-Implementierungen zuzugreifen und sie zu dekompilieren, aber dies kann schwierig und möglicherweise illegal sein.

Zurück zur ursprünglichen Frage, da nativer Maschinencode, ein BIOS, erstellt werden muss müsste in einer Programmiersprache implementiert werden, die von einem nativen Maschinencode-Compiler unterstützt wird. Obwohl es viele solcher Sprachen gibt und ich sicher bin, dass in den letzten Jahrzehnten mehrere Sprachen zum Experimentieren verwendet wurden, basiert jede offene BIOS-Implementierung, die ich finden konnte, speziell auf einer Kombination aus C und / oder Assembly BIOS-Implementierungen aus Quellen, die ich mir angesehen habe, um diese Schlussfolgerung zu ziehen, umfassen OpenBIOS , tinyBIOS , coreboot , Intel BIOS und Libreboot . Ich habe mir auch einige sehr alte BIOS-Implementierungen angesehen, die heute nicht relevant sind, aber auch der C- und / oder Assembly-Regel folgen.

Ich denke, es ist auch relevant, sich andere Software anzusehen, für die gebaut wurde direkt mit Hardware interagieren.Wir wissen zum Beispiel, dass der Linux-Kernel , der OS X-Kernel und der Windows-Kernel sind größtenteils C mit einigen Assembly- und einigen höheren Sprachen für bestimmte Aufgaben. Wir wissen auch, dass Hardwaretreiber unter Linux und Hardwaretreiber unter Windows größtenteils in C geschrieben sind

Zurück zum BIOS, ich denke, es ist auch wichtig, die Wirtschaftlichkeit der gewählten Programmiersprache zu berücksichtigen. BIOS wird im Allgemeinen als eine Notwendigkeit geschrieben, um den Hardwareverkauf zu ergänzen. Moderne BIOS-Systeme sind bekanntermaßen weitgehend vorhanden geschrieben in C und / oder Assembly. Ein Wechsel zu einem anderen Tool würde erhebliche Kosten für das verursachen, was allgemein als Warenprodukte angesehen wird, was den Umsatz sehr beeinträchtigen könnte. Ohne auf Economics 101 einzugehen, kann ich Ihnen versichern, dass dies wahrscheinlich nicht der Fall ist Es lohnt sich für einen OEM, von bewährten Tools abzuweichen, die sich über Jahrzehnte bewährt haben.

Natürlich gibt und wird es auch Hobbyprojekte geben, um BIOS zu schreiben. Auch diese scheinen sich bisher für C und / oder Baugruppe zu entscheiden. Vielleicht werden eines Tages andere Technologien eingesetzt. Aber heute ist die Auswahl klar definiert.

Kommentare

  • Es ist ein bisschen Nit-Picking, aber C # und Java werden nicht interpretiert . Sie kompilieren zu Bytecode. Es ist der Bytecode, der dann von einem Interpreter verarbeitet wird. Ändert ‚ nicht die Logik des ersten Absatzes.
  • @Tonny Das ‚ ist korrekt. Ich habe “ direkt oder mittelinterpretiert “ hinzugefügt, um etwas klarer zu sein.
  • @Tonny normalerweise a Jitter statt eines Interpreters, was eine wichtige Unterscheidung ist, da es ‚ möglich ist, alles auf native zu setzen, solange bestimmte dynamische Techniken nicht ‚ wird nicht verwendet. Als solches wäre es theoretisch nahezu möglich, ein BIOS in .NET-Sprachen oder Java zu schreiben, wenn man beides tut und sicherstellt, dass alle erforderlichen Laufzeitunterstützungen verfügbar sind. Ich stelle mir vor, dass die Bemühungen, dies zu tun, die gefundene Bequemlichkeit mehr als in den Schatten stellen würden.
  • @Tonny Tatsächlich wird C # mit nativem Code msdn.microsoft.com/de kompiliert -us / vstudio / dotnetnative.aspx Es ist also ‚ seltsam, es in der Liste der schwachen / dynamischen Sprachen zu sehen.
  • @Den C # wird normalerweise nicht zu nativem Code kompiliert. Dieses .Net Native-Produkt, auf das Sie verlinken, wurde noch nicht offiziell veröffentlicht. Nach dem, was ich ‚ gelesen habe, werden der Anwendungscode und der erforderliche Framework-Code in eine ausführbare Datei kompiliert. Laut den häufig gestellten Fragen richtet sich dies zunächst an Windows Store-Apps. Daher kann es einige Zeit dauern, bis dies in größerem Umfang unterstützt wird. Abgesehen davon scheint es, dass Microsoft sich in Zukunft möglicherweise vom Modell der virtuellen Maschine entfernt, wenn alles gut geht.

Antwort

Das eigentliche BIOS für einen Computer wird in einer Sprache (wahrscheinlich C oder Assembly) geschrieben, die zu architekturabhängigem Binärcode kompiliert wird. Dieser Code kann auf keiner anderen Architektur ausgeführt werden (und muss es wohl auch nicht, da er bereits sehr spezifisch für den Computer ist, mit dem er ausgeliefert wird).

Aber denken Sie möglicherweise an Options-ROMs (die manchmal als BIOS bezeichnet werden, wie in „Video-BIOS“ für ein GPU-Options-ROM)?

Für tatsächliche, ältere BIOS-kompatibel Bei Options-ROMs handelt es sich wahrscheinlich um ISA-abhängigen ausführbaren Code (der wiederum von jeder Sprache generiert wird, die für die gewünschte Architektur kompiliert werden kann). PCI ermöglicht auch das Einschließen von Code für mehrere ISAs und ermöglicht dem Host, das entsprechende Binärimage während des Startvorgangs auszuwählen.

Für UEFI-kompatible Option In ROMs gibt es auch ein architekturunabhängiges Bytecodeformat , das auf verschiedenen Architekturen ausgeführt werden kann, aber auch weiterhin ISA-abhängiger Code verwendet werden kann. P. >

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.