Wo befindet sich der Anzeigepuffer auf einer Computerplatine? [geschlossen]

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:

Geben Sie hier die Bildbeschreibung ein

Im Grafikkartenspeicher. Übrigens kann man so mit der Grafikkarte nur in einem geeigneten Textmodus Zeichen auf den Bildschirm schreiben. Sie erwähnen das in Ihrer Frage nicht, es lohnt sich, es zu bearbeiten, um dies für andere Leser zu sagen.
0xb8000ist 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.
Brian hat Recht. Alte PC-Computer waren auf 20 Adressbits beschränkt. Das alte Videoboard hat sich in diesen Adressraum abgebildet. Der 80286 fügte 4 Adressbits hinzu, aber das Verlassen des geschützten Modus erforderte einen CPU-Reset. Also keine Änderung an der Kartenadressenzuordnung. 80386 hat dies behoben und die Neuzuordnung im geschützten Modus ermöglicht. Der Speicher der Videoplatine nahm ebenfalls zu. Einige wurden also virtuell in alte Adressen neu abgebildet. Heute ist es noch komplexer, aber Legacy-Unterstützung wird durch Treibercode bereitgestellt.
Brian, Jonk: Diese Kommentare sind Antworten. Poste sie vielleicht so?
Angenommen, Sie führen es in einer DOS-Box auf einem grafischen Betriebssystem aus, Sie schreiben irgendwo in den RAM und es wird vom Programm ausgelesen und von einigen Treibern als Pixel in den Video-RAM gerendert
@Marcus Meine Antworten sind immer so geschrieben, dass sie eine umfassende Ansicht vermitteln, oder es ist mir egal. Einige hier schreiben nur schnelle, gestrichene Antworten. Ich möchte einen Beitrag leisten, wenn es einen Wert hat, der über das OP hinausgeht. Sonst lohnt es sich für mich nicht. Schon zu viel Müll auf der Welt. Ich möchte, dass ein kleiner Teil mehr zum Durchwaten hinzufügt. Ich müsste mehr von dem schreiben, was ich weiß (und es ist viel zu diesem Thema), habe aber jetzt zu wenig Zeit. Brian kann den Cudo haben.
@jonk du hast eine ziemliche Arbeits-/Inhaltsethik! mein Respekt.
Das Problem ist, ich bin bei @jonk. Ich möchte nicht einmal versuchen, die Abstraktionsschichten zwischen dem Assembler des OP und moderner Hardware aufzulisten, ich würde sicherlich einige vermissen, es würde ein Buch brauchen, um dem gerecht zu werden. (Beachten Sie, dass sogar der verlinkte Text alle seine Übungen über einen SW-Emulator ausführt!)
@jonk @BrianDrummond Danke. Ich kann mich nicht mit dem Mapping-Prozess und den damit verbundenen Abstraktionsschichten auseinandersetzen, und es stört mich. Ich frage mich, ob Sie einige gute Lehrbücher vorstellen können? Darf ich noch eine Frage stellen? Am Prozessor, wenn der Befehl mov [edx], axausgeführt wird, während edxgleich ist 0x000b8000, 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.
@ user4838962 Morgen habe ich vielleicht etwas Zeit, um genügend Gedanken zu machen. Ich arbeite seit Ewigkeiten an Grafikkarten, einschließlich der Änderungen mit pci und agp und der Emulation im geschützten Modus für Legacy-Code. Der io-Bus ist mit dem Aufkommen von Super io und Advanced PIC und auch Multi-CPU radikal anders. South Bridge für die Unterstützung alter Karten ist jetzt größtenteils weg. Usw. Viel zu schreiben. Muss viel bearbeiten.
@jonk Super, ich weiß es zu schätzen.
Zu dem Zeitpunkt, an dem die movAnweisung 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.
Diese Frage ist zu weit gefasst, um beantwortet zu werden, da in PC-kompatiblen Maschinen alle möglichen Lösungen verwendet wurden: dedizierter Videospeicher und auch das Ausleihen eines Teils des Hauptspeichers (einschließlich der Bandbreite für den Zugriff), um nur zwei der offensichtlichsten zu nennen. Wenn Sie sich ein bestimmtes Modell ansehen, bei dem die Grafikkarte über integrierten RAM verfügt, wird dieser wahrscheinlich verwendet, zumindest in Modi, in denen dies ausreichend wäre.

Antworten (2)

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.

Ich war ein kleiner Teil des Phoenix-BIOS-Teams in der Zeit, als pci begann und ppro und p ii aktive Produkte bei Intel waren. Ich war die Intel-Schnittstelle, da ihnen damals die Hälfte von Phoenix gehörte. Hier gibt es so viele historische Details. Mit modernen (heute ganz anders als damals, als die Unterstützung bei Win2000 so viel besser war und sich danach allmählich auf ein Minimum reduzierte) Betriebssysteme wird es durch Interrupts über bis zu 64 Schichten zu speziellen Treibern, die zum Fälschen von Dingen entwickelt wurden, vollständig emuliert. Langsam, aber halb funktioniert für einige minimale Dinge. Viel Emulation geht verloren und wird auch nicht mehr unterstützt.
Moderne PC-Firmwares (nicht mehr wirklich ein „BIOS“) bieten immer noch die Legacy-BIOS-Interrupts und richten all diese Speicherzuordnungen für die Kompatibilität mit Legacy-Bootloadern ein (obwohl die BIOS-Serviceroutinen manchmal etwas fehlerhaft sein können). Nur reine UEFI-Firmwares haben diese Unterstützung aufgegeben.
Ziemlich sicher, dass es heute Budgetimplementierungen von PC-kompatibler Hardware gibt, die einen Teil der Kapazität und Bandbreite der Hauptsystemspeichergeräte für den Bildspeicher ausleihen.
Dieser Hack funktioniert auf modernen Computern, die ältere Computer simulieren, was sie immer noch tun (zuletzt habe ich nachgesehen). Aber nur, wenn Sie kein fortgeschritteneres Betriebssystem als DOS verwenden.