In einem OS-Entwicklungstext von Nick Blundel in Kapitel 4.1 mit dem Titel Adapting to Life Without BIOS wird erklärt, dass wir ASCII-Zeichen auf dem Bildschirm schreiben können, während sich die Grafikhardware im Textmodus befindet , indem wir sie beginnend bei address direkt in den Anzeigepuffer schreiben 0xb8000
.
Daher kann ich mit NASM-Assembler so etwas machen:
VIDEO_MEMORY equ 0x000b8000
mov edx, VIDEO_MEMORY
mov [edx], ax ; "al" register already contains character itself
; "ah" register already contains character attributes
Mein Assembler-Code funktioniert einwandfrei, aber ich habe eine Frage zum Speicherort des Anzeigepuffers: Wo ist er? Befindet sich der Anzeigepuffer im Haupt-RAM des Computers oder im Grafikkartenspeicher?
Vielleicht verdeutlicht folgendes Bild meine Frage:
Ich habe weder die Zeit noch die Lust, hier ein Buch über das Schreiben eines eigenen Betriebssystems für die Prozessoren der x86-Familie zu schreiben. Wir befinden uns jetzt nicht nur in einer Zeit, in der der Bootvorgang selbst einige große Veränderungen erfahren hat.
Das meiste, was folgt, ist alte Geschichte. Wenn Sie also möchten, springen Sie zum Ende, wo ich versuche, Ihre Frage direkt zu beantworten.
Jeder, der versucht, etwas von Grund auf neu zu entwickeln, muss die Entwicklerhandbücher für 64- und 32-Bit-Architektursoftware lesen . Es ist nur etwa 5000 Seiten lang. Also vielleicht ein paar Nächte lesen? Oh. Fast vergessen. Vergessen Sie nicht, die 64- und 32-Bit-Dokumentationsänderungen zu lesen . Das sind nur 2000 weitere Seiten. Wenn Sie einen Überblick über alles haben möchten , was Sie wahrscheinlich lesen müssen, finden Sie ihn hier: Technische Dokumentation für Intel-Prozessoren verstehen . (Ich möchte nicht einmal versuchen, die Seiten dort zu zählen.)
Es hilft sehr, wenn Sie sich zunächst damit vertraut machen, was der Prozessor tut, wenn er aus dem Power-On-Reset kommt. (Es gibt auch einen "Warm-Reset", also seien Sie noch nicht zu verwirrt.) Einige Dinge können nicht ohne einen vollständigen Power-On-Reset geändert werden (Einige "Safer-Mode-Erweiterungen", die zum Beispiel in der IA32_FEATURE_CONTROL MSR zu finden sind.)
Das gesamte Power-On-Reset-Verhalten des Prozessors wurde im Laufe der Jahre radikal verändert. Es hilft, sich mit diesem Prozess vollständig vertraut zu machen, wenn Sie beabsichtigen, etwas zu schreiben. Vor allem, wenn Sie vorhaben, den Code des BIOS-Chips auf dem Motherboard vollständig zu ersetzen !!
Das ist genug, um jemanden verrückt zu machen. Ich war gezwungen, dieses Zeug zu lesen, zusammen mit Unmengen an Dokumentation über PCI, AGP, South Bridge, da ich Fehler in der PCI-zu-ISA-Schnittstelle identifizierte – etwa 50 % aller Chipsatz-Fehler von Intel zu dieser Zeit. Es gibt Spezifikationsaktualisierungen (einige davon sind vielleicht „vertraulich“ geworden, aber zu der Zeit, als ich an diesem Zeug arbeitete, veröffentlichte Intel sie, wenn Sie genau wussten, wonach Sie fragen mussten.) Ich musste auch in eine sichere Einrichtung gehen, um „zu überprüfen out" andere Bücher, die Intel NICHT veröffentlicht.
Wenn Sie nur vom Verhalten des vorhandenen ROM-Codes abhängen möchten, müssen Sie untersuchen, wie ein PC tatsächlich über diesen Code hochfährt. Und Sie sind dem Spiel weit voraus, da Sie anderen erlauben, alles für Sie einzurichten.
Zuletzt habe ich überprüft, ob Sie beim Booten eines PCs (nicht UEIF) entscheiden können, ob Sie ein PnP-Betriebssystem (Plug and Play) haben oder nicht. Wenn Sie "Ja" sagen, stört das BIOS nicht, all diese PCI zu konfigurieren Geräte (mit Ausnahme der Grafikkarte und einiger anderer, die für den Anfang unbedingt erforderlich sind). Stattdessen überlässt es sie dem Betriebssystem selbst, sich später darum zu kümmern. Wenn Sie sagen, dass Sie kein PnP-Betriebssystem haben (und das sollten Sie sagen, wenn Sie Ihr eigenes schreiben), dann wird das BIOS alle diese ausgefallenen PCI-Geräte für Sie aufzählen und bis dahin Code mit der Ausführung beginnt, alle diese PnP-PCI-Geräte sind bereits aktiv und einsatzbereit. Das ist eine gute Sache, wenn Sie gerade erst anfangen, selbst Betriebssysteme zu schreiben.
Das BIOS erledigt auch viele andere Dinge für Sie. Wenn mehrere CPUs vorhanden sind, werden alle bis auf eine für Sie heruntergefahren. Die Speichersticks werden herausgefunden und richtig zugeordnet, so dass sie einen zusammenhängenden Speicher bilden und mit den richtigen Timing-Einstellungen betrieben werden (es gibt VIELE Möglichkeiten, den Chipsatz für den Speicher zu konfigurieren, also ohne dass das BIOS dies für Sie tut die Standardsituation kann sehr unterschiedlich sein.) All dies ist Teil einer Reihe aufeinanderfolgender Schritte, und wenn Sie eine dieser ausgefallenen BIOS-Code-Anzeigen haben, können Sie jederzeit herausfinden, wo sie sich befindet, während sie durchläuft.
Frühe Systeme (ich kann nicht für die heutigen sprechen, da ich sie nicht getestet habe) ermöglichten auch das Herunterladen von Code über den Tastaturanschluss. Das BIOS würde also prüfen, ob dort etwas Code einspeisen möchte. Dies erleichterte das Testen der Motherboards in der Fertigung erheblich. Aber es war auch ein Merkmal dieser Maschinen. Heute? Ich weiß nicht.
"Real Mode" oder 16-Bit-Modus gibt es eigentlich nicht mehr. Der letzte Chip, der dies implementierte, war der 80286. Beginnend mit dem 80386 richteten sie interne Schattenregister auf "Standardwerte für das Zurücksetzen beim Einschalten" ein, die den älteren Modus "emulierten". Allerdings hatte der Prozessor nach dem 80286 keinen Real Mode mehr. Stattdessen befindet er sich ab dem 80386 immer im Protected Mode. Es ist nur so, dass Sie die Dinge beim Zurücksetzen so einrichten können, dass es wie der echte Modus "aussieht". Wenn Sie dabei knifflig sein wollen, können Sie tatsächlich sehen, dass 21 (nicht 20) der 36 Adresszeilen, die aus dem 80386 herausführen, von darauf ausgeführtem Real-Mode-Code beeinflusst werden können. Dies liegt daran, dass ihr sogenannter "realer Modus" tatsächlich ein geschützter Modus war und die Adressaddierer immer noch dieses 21. Adressbit erzeugen konnten. Bei den älteren Geräten war das nicht
Angenommen, Sie booten im "Real Mode" und laufen als 16-Bit-Startup, dann hat das BIOS die komplexe Grafikkarte bereits so abgebildet, dass sie in Ihrem Adressraum "sichtbar" ist. Ältere Nur-Text-Karten ("monochrom") befanden sich am Segmentwert = 0xB000 und stellten 32 kByte bereit. Der CGA begann bei 0xB800 (um die monochrome Karte zu vermeiden) und hatte auch 32k Byte. Aber jetzt könnten Sie zusammen mit dem Textbyte ein Farbbyte liefern. Das EGA erhielt dann 0xA000 und war 64k groß. Irgendwann wurden die Dinge kompliziert. Sie hatten den VGA, den PGA und ... dann brach alles los und die Speichergrößen explodierten und konnten nicht mehr in den 16-Bit-Adressraum "passen".
Die neueren Karten ermöglichten es Ihnen also, verschiedene Speicherbänke "einzulagern" und "auszulagern". Aber schon bald konnten diese Boards nur noch nützlich sein, wenn Sie im geschützten Modus liefen und STÄNDIG einfachen Zugriff auf ihren GESAMTEN Speicher hatten.
Heute besitzt das Betriebssystem selbst das Display vollständig und führt es im geschützten Modus aus. In dem Maße, in dem Sie möglicherweise eine "DOS-Box" innerhalb des Betriebssystems ausführen, erweitert es lediglich einen speziellen Speicherbereich in den winzigen Speicherplatz, der dem DOS-Box-Code zugewiesen ist. Wenn Sie in diesen Speicher schreiben, verursacht dies wiederum ein Interrupt-Ereignis im geschützten Modus (es wird Ihnen verboten, tatsächlich darauf zu schreiben, sodass eine Ausnahme stattfindet), das die Anweisung interpretiert und herausfindet, wie sie in den aktuellen Kontext emuliert werden kann. Dasselbe gilt für alle E/A-Befehle, die Sie versuchen auszuführen. Diese werden alle emuliert. Es gibt auch "illegale Befehlsfallen", die ebenfalls ein Interrupt-Ereignis erzwingen, die der Ereignishandler des geschützten Modus jedoch "sehen" kann.
Der erste Schritt, den Sie vielleicht versuchen sollten, besteht darin, entweder im geschützten 16-Bit- oder im 32-Bit-Modus zu arbeiten. Das bedeutet, IDT, GDT und LDT einzurichten und ein erneutes Laden der Schattenregister zu erzwingen (auf die Sie nicht direkt zugreifen können, die Sie jedoch durch bestimmte Schritte füllen können). Dann sehen Sie, ob Sie immer noch mit dem Display sprechen können, aber jetzt im geschützten Modus.
Ich habe eine Frage zum Speicherort des Anzeigepuffers: Wo ist er? Befindet sich der Anzeigepuffer im Haupt-RAM des Computers oder im Grafikkartenspeicher?
Der Speicher der Grafikkarte ist über einen speziellen Bus namens AGP, AGP Pro oder AGP 64 mit dem Chipsatz verbunden wie sie es früher taten (oder davor die ISA), gibt es deutlich gelockerte Anforderungen für die Übertragung von Daten zwischen der CPU und dem Grafikspeicher. Wen interessiert es zum Beispiel, ob Pixel #4714 vor oder nach Pixel #1081 geschrieben wird? Bei einem Betriebssystem und Threads, auf denen Code ausgeführt wird, kann diese Reihenfolge wichtig sein. Aber bei einem Grafikprozessor, der einen Bildschirm anzeigt, spielt das wirklich keine Rolle. Dem Chipsatz wird also mehr Freiheit bei Speicherübertragungen eingeräumt, was einige Beschleunigungsregeln im Chipsatz ermöglicht.
Wenn Sie im x86-"Fake-Real-Modus" booten, wurde ein Teil des Speichers der Grafikkarte dem 20-Bit-Adressraum (+1, wenn Ihr Segment und Offset so weit geht) Ihres 16-Bit-Modus zugeordnet für den direkten Zugriff. Die internen Register der Videokarte sind ebenfalls für Sie vorkonfiguriert, sodass sie eine der alten Karten emuliert und nicht den gesamten zusätzlichen Speicher verbraucht, der ihr beim Zeichnen eines Bildschirms zur Verfügung steht. (Und die Aktualisierungsraten und andere Dinge werden entsprechend durch den Code konfiguriert, der sich auf der Grafikkarte befindet und vom BIOS aufgerufen wird, bevor Ihr Code startet.)
Sie schreiben also tatsächlich direkt in den Speicher, wenn Sie Code ausführen, der direkt gebootet wurde, um im Real-Modus ausgeführt zu werden. Allerdings wird nur die Spitze des Eisbergs des Videospeichers in Ihren Adressraum gesteckt.
Wenn Sie andererseits einen ähnlichen Assembler-Code unter einem Betriebssystem in einer Art DOS-Box ausführen, schreiben Sie überhaupt NICHT in den Videospeicher. Alles, was Sie tun, ist, ein Interrupt-Ereignis zu verursachen, das eine Software aufruft, die in Ihren Speicherplatz zurückkehrt, die Anweisung liest und die dortigen Register ansieht und dann Ihre Anweisung emuliert, bevor Sie zurückkehrt.
Also ... es kommt darauf an.
Früher konnte ich PC/104-Systeme mit Chipsätzen abholen, die noch den alten ISA-Bus unterstützten. Ich habe in letzter Zeit nicht in diese eingecheckt. Aber wie gut die alten 8-Bit/16-Bit-ISA-Modi weiterhin unterstützt werden, hängt stark davon ab, ob noch jemand die benötigten Chipsätze herstellt und unterstützt. Ich glaube nicht, dass irgendjemand das tun wird, was der Kaypro 286i getan hat, indem alle diskreten Teile der 7400-Serie auf dem Motherboard verwendet wurden, bevor C&T seine Chipsätze herstellte, um die Busgeschwindigkeit von der CPU-Geschwindigkeit zu entkoppeln. Das sind eine Menge SSI-Chips, um das zum Laufen zu bringen, und so ziemlich niemand wird sich heute darum kümmern. Wenn es also kein Southbridge-Äquivalent mehr gibt, müssen die PC/104-Hersteller weiterziehen und den alten ISA-Bus in irgendeiner Weise hinter sich lassen.
(Meine Wette ist, dass sie nicht weitermachen konnten, sondern stattdessen eine Art Zusatzplatine entwickelt haben, anstatt die Funktionalität auf der Haupt-CPU-Platine aufzunehmen. Wenn ja, frage ich mich, ob sie jetzt 8-Bit-Modi unterstützen oder ob es so ist Ich frage mich auch ganz besonders, ob sie DMA noch unterstützen -- da die DMA/PCI-Schnittstelle das Schwierigste war [DMA erforderte ein präzises Timing, das NICHT angehalten werden konnte, und PCI unterstützt nur Burst-Modi und MUSS regelmäßig angehalten und dann neu gestartet werden.] Wenn ich wetten würde, würde ich wetten, dass ISA DMA entweder nicht mehr unterstützt wird oder sonst riesige Dollars kostet, um es zu bekommen.)
Vielleicht funktionierte Ihr Hack im Pleistozän, zu Beginn der Personal Computer, die meiste Zeit.
Heutzutage befindet sich der Grafikspeicher auf der Grafikkarte oder ist eng mit dem Grafikchip gekoppelt. Es kann wahrscheinlich speicherabgebildet werden, aber nicht vor einigen Setups und schon gar nicht an einer festen Adresse wie B8000h.
Ich erinnere mich vage, dass frühe PCs einen Textpuffer im Speicher abgebildet haben, den die Grafikhardware im Glas-Teletyp- Modus anzeigen würde, und das könnte bei B8000h gewesen sein. Dies war die Einschaltvorgabe, damit Status- und Diagnosemeldungen dem Benutzer schon sehr früh im Boot-Vorgang angezeigt werden konnten. Schließlich, nachdem genügend Betriebssystem geladen wurde, übernahm es die Speicherverwaltung, schaltete das Grafiksubsystem in den Bitmap-Grafikmodus und die Anzeige wurde ganz anders angesteuert.
Vielleicht bleiben einige Architekturen heute mit dem alten Power-Up-Modus kompatibel. Seitdem hat sich das BIOS jedoch stark weiterentwickelt, und Anwendungen, die vom BIOS geladen werden, verlassen sich nicht mehr auf fest zugeordnete Speicheradressen. Auf einigen Rechnern heute, vielleicht , können Sie das Grafiksystem so verwenden, wie Sie es beschrieben haben, wenn Sie irgendwie an den Rechner herankommen, bevor das BIOS läuft.
Dazu müssten Sie im Grunde Ihr eigenes "Bios" erstellen. Es müsste nicht wirklich ein BIOS sein, da es die nächste Anwendungsschicht nicht unterstützt. Es wäre wirklich Ihr eigenes sehr primitives Programm, das sofort nach dem physischen Einschalten oder Zurücksetzen auf der PC-Hardware ausgeführt wird. Natürlich stehen Ihnen dann keinerlei Betriebssystemdienste zur Verfügung, nicht einmal die primitiven, die vom BIOS bereitgestellt werden, um ein modernes Betriebssystem selbst hochfahren zu lassen.
Toni M
user_1818839
0xb8000
ist keine universelle Wahrheit: Es ist nur a priori Wissen über einen bestimmten historischen Computer, der einen Präzedenzfall geschaffen hat, dem viele Computer noch folgen. In Computern dieser Zeit wäre dieser Adressbereich der Grafikkarte zugeordnet worden. Heutzutage gibt es so viele Ebenen von Adressübersetzungshardware zwischen CPU und Speicher - und darüber hinaus Softwareemulation -, dass es nicht mehr wirklich stimmt, aber solange das Betriebssystem (Sie beginnen immer noch mit dem BIOS beim Booten) diese einrichtet Ebenen korrekt, können Sie so programmieren, als ob es immer noch wahr wäre.jonk
Markus Müller
PlasmaHH
jonk
Markus Müller
user_1818839
Benutzer4838962
mov [edx], ax
ausgeführt wird, währendedx
gleich ist0x000b8000
, verwendet der Prozessor den Bus, der zum Hauptspeicher geht, oder verwendet er einen E/A-Bus, der zur Grafikkarte geht, oder verwendet er einen E/A-Bus Was geht zu einem Board-Chip (wie North-Bridge) und dann zur Grafikkarte? Entschuldigung, wenn es nicht die klügste Frage ist.jonk
Benutzer4838962
user_1818839
mov
Anweisung ausgeführt wird, gelangen die Daten möglicherweise nicht weiter als bis zum L2-Cache auf demselben Chip wie der/die CPU-Kerne selbst. Abhängig von anderen Ereignissen und wie die Cache-Steuerlogik konfiguriert ist, wird irgendwann später etwas anderes damit passieren. Aber was und wann, überlasse ich gerne @jonk.Chris Stratton