Was passiert wirklich auf moderner PC-Hardware, die im 16-Bit-Legacy-BIOS-MBR-Modus gestartet wird, wenn Sie ein Byte wie '1'
(0x31) im VGA-Text- Framebuffer (Modus 03) unter physischer linearer Adresse speichern B8000
? Wie langsam ist ein mov [es:di], eax
Geschäft mit der MTRR für diese Region auf UC eingestellt? ( Experimentelle Tests auf einem Kaby Lake iGPU-Laptop haben ergeben , dass clflushopt auf WC ungefähr die gleiche Geschwindigkeit wie UC für VGA-Speicher hat. Ohne clflushopt verlassen mov
Speicher im WC-Speicher jedoch niemals die CPU und aktualisieren den Bildschirm überhaupt nicht und laufen superschnell .)
Wenn es sich nicht um eine SMI für jedes Geschäft handelt, gibt es eine Möglichkeit, diese Kosten für einen Teil des WB-Speichers im Benutzerbereich für Leistungsexperimente ohne tatsächlichen Neustart im Real-Modus zu schätzen? (z. B. Verwenden einer BSS-Seite als vorgetäuschten Framebuffer, der eigentlich nirgendwo angezeigt wird).
Das entsprechende Schriftzeichen wird bei der nächsten Aktualisierung auf dem Bildschirm angezeigt. Liest das Hardware-Scan-Out das ASCII-Zeichen wirklich aus dem VRAM (oder DRAM für eine iGPU) und ordnet es im laufenden Betrieb Bitmap-Schriftzeichen zu? Oder gibt es in jedem Geschäft oder einmal pro vblank ein Software-Abfangen, sodass die echte Hardware nur einen Bitmap-Framebuffer verarbeiten muss?
Beim Booten von Legacy-BIOS wird bekanntermaßen der System Management Mode (SMM) verwendet , um USB kbd / mouse als PS / 2-Geräte zu emulieren. Ich frage mich, ob es auch für den Framebuffer im VGA-Textmodus verwendet wird. Ich nehme an, es ist für VGA I / O - Ports für die Modus-Einstellung verwendet , aber es ist plausibel , dass ein Text Framebuffer von der Hardware unterstützt werden könnte. Die meisten Computer verbringen ihre gesamte Zeit jedoch im Grafikmodus. Daher scheint es etwas zu sein, das Anbieter möglicherweise tun möchten, wenn sie die HW-Unterstützung für den Textmodus weglassen. (OTOH dieser Blog schlägt vor, dass ein Homebrew-Verilog-VGA-Controller den Textmodus ziemlich einfach implementieren kann.)
Ich interessiere mich speziell für Systeme, die die iGPU in Intel Skylake verwenden, würde mich aber für frühere / spätere iGPUs von Intel und AMD sowie für neue oder alte diskrete GPUs interessieren.
(Einschließlich anderer Anbieter als AMD und NVidia; es gibt einige Skylake-Motherboards mit PCI-Steckplätzen, nicht PCIe. Wenn moderne GPU-Firmware-Treiber den Textmodus emulieren, gibt es vermutlich einige alte PCI-Grafikkarten mit Hardware-VGA-Textmodus. Und möglicherweise eine solche Karte könnte dazu führen, dass Geschäfte nur eine PCI-Transaktion anstelle einer SMI sind.)
Mein eigener Desktop ist ein i7-6700k in einem Asus Z170 Pro Gaming-Mobo, keine Zusatzkarten, nur eine iGPU mit einem 1920x1200-Monitor am DVI-D-Ausgang. Ich kenne die Details des Kaby Lake i5-7300HQ-Systems nicht, auf dem @Eldan testet, nur das CPU-Modell.
Ich habe das Patent US20120159520 von Phoenix BIOS aus dem Jahr 2011 gefunden ,
das Legacy-Videos mit uefi emuliert . Anstatt von Videohardwareanbietern zu verlangen, dass sie sowohl UEFI- als auch native 16-Bit-Realmodus-Options-ROM-Treiber bereitstellen , schlagen sie einen Realmodus-VGA-Treiber ( int 10h
Funktionen usw.) vor, der einen vom Hersteller bereitgestellten UEFI-Videotreiber über SMM-Hooks aufruft.
Zusammenfassung
[...] Das generische Videooptions-ROM benachrichtigt einen generischen Video-SMM-Treiber über die Anforderung von Videodiensten. Eine solche Benachrichtigung kann unter Verwendung eines Software System Management Interrupt (SMI) durchgeführt werden. Nach der Benachrichtigung benachrichtigt der generische Video-SMM-Treiber einen UEFI-Videotreiber eines Drittanbieters über die Anforderung von Videodiensten. Der Videotreiber eines Drittanbieters stellt die angeforderten Videodienste für das Betriebssystem bereit. Auf diese Weise unterstützt ein UEFI-Grafiktreiber eines Drittanbieters möglicherweise eine Vielzahl von Betriebssystemen, auch solche, die die UEFI-Anzeigeprotokolle nicht nativ unterstützen.
Ein Großteil der Beschreibung behandelt die Bearbeitung von int 10h
Anrufen und ähnlichen Dingen, die offensichtlich bereits das IVT durchlaufen, und kann daher problemlos benutzerdefinierten Code ausführen, der absichtlich eine SMI auslöst. Der relevante Teil ist das, was sie für direkte Speicherungen im Framebuffer im Textmodus beschreiben, die auch für Code funktionieren müssen, der keine Software- oder Hardware-Interrupts auslöst. (Anders als HW, das SMI in solchen Geschäften auslöst, die sie verwenden können, wenn sie unterstützt werden.)
Unterstützung für Textpuffer
In bestimmten Ausführungsformen können Anwendungen den Textpuffer des VGA direkt manipulieren . In einer solchen Ausführungsform unterstützt der generische Video-SMM-Treiber 130 dies auf eine von zwei Arten, abhängig davon, ob die Hardware eine SMI-Überfüllung beim Lese- / Schreibzugriff auf den 740 KB-768 KB-Speicherbereich (wo sich die Textpuffer befinden) bereitstellt .
Wenn eine SMI-Überfüllung verfügbar ist, erzeugt die Hardware bei jedem Lese- oder Schreibzugriff eine SMI. Unter Verwendung der Trap-Adresse des SMI-Traps kann die genaue Textspalte und -zeile berechnet und auf die entsprechende Zeile und Spalte im virtuellen Textbildschirm zugegriffen werden.
Alternativ wird normaler Speicher für diesen Bereich aktiviert und unter Verwendung eines periodischen SMI sucht der generische Video-SMM-Treiber 130 nach Änderungen im emulierten Hardware-Textpuffer und aktualisiert den entsprechenden virtuellen Textbildschirm, der vom Videotreiber verwaltet wird. In beiden Fällen wird das Zeichen auf dem virtuellen Textbildschirm neu gezeichnet, wenn eine Änderung festgestellt wird.
Dies ist nur das Patent eines BIOS-Anbieters und sagt uns nicht, wie die meiste Hardware tatsächlich funktioniert oder ob andere Anbieter andere Dinge tun. Es ist im Wesentlichen bestätigen , dass einige Hardware vorhanden ist , wo Falle auf Geschäfte in diesem Bereich, though. (Es sei denn, dies ist nur eine hypothetische Möglichkeit, die sie in ihrem Patent behandelt haben.)
Für den Anwendungsfall, an den ich denke, wäre das Überfüllen nur bei der Bildschirmaktualisierung erheblich schneller als das Überfüllen in jedem Geschäft. Daher bin ich gespannt, welche Hardware / Firmware auf welche Weise funktioniert.
Motivation für diese Frage
Optimieren eines inkrementierenden ASCII-Dezimalzählers im Video-RAM des Intel Core der 7. Generation - wiederholtes Speichern neuer Ziffern für einen ASCII-Textzähler in denselben wenigen Bytes des Video-RAM.
Ich habe eine Version des Codes im 32-Bit-Benutzerbereich unter Linux im WB-Speicher getestet, in der Hoffnung, die Situation mit movnti
und auf verschiedene Arten zu approximieren , damit die CPU ihren WC-Puffer nach jedem Speicher (oder vielleicht gelegentlich in) mit dem Video-RAM synchronisiert ein Timer-Interrupt). Dies ist jedoch nicht realistisch, wenn die Bootloader-Situation im Real-Modus nicht nur im DRAM gespeichert, sondern stattdessen eine SMI ausgelöst wird.
Im WB-Speicher ist das Löschen von movnti
Speichern mit a lock xor byte [esp], 0
etwas schneller als das Löschen mit clflushopt
. Aber @Eldan meldet keine Geschwindigkeitsverbesserung für diejenigen im VGA-Speicher, nachdem ein MTRR so programmiert wurde, dass es WC wird. (Und die gleiche Geschwindigkeit wie beim Original, bei dem normale Speicher ausgeführt werden, was darauf hinweist, dass der VGA-Framebuffer standardmäßig UC war. Einige ältere BIOS hatten die Option, VGA-Speicher-WC zu erstellen, das sie USWC = Uncached Speculative Write Combining nannten.)
Es ist kein reales Problem, daher suche ich nicht nach tatsächlichen Problemumgehungen . Es wäre jedoch interessant zu wissen, ob das manuelle Speichern von Pixelbytes in einem VGA-Grafikmodus viel schneller sein könnte.
Zusammenfassung
- Lösen einige / alle echten modernen Systeme in jedem Geschäft eine SMI für den Framebuffer im Textmodus aus?
- Wenn nein, können wir einen WC-Speicher + Clflush an den Framebuffer annähern, indem wir ein movnti + etwas im User-Space im WB-Speicher verwenden? So können wir uns leicht
perf
für Leistungsindikatoren profilieren . - Welche unterschiedlichen Strategien verwenden verschiedene BIOS und / oder Hardware? (Ich möchte keine Details, nur eine hohe Ebene wie "SMI jedes vblank, um den VGA-Framebuffer mit dem tatsächlichen Hardware-Framebuffer zu synchronisieren")
- Wäre eine PCIe- oder PCI-Grafikkarte mit Hardware-VGA-Textmodus schneller als die integrierten GPUs? Ich vermute, dass eine tatsächliche PCIe-Schreibtransaktion langsamer ist als das Warten, bis ein Geschäft den DRAM erreicht, aber dass ein PCIe-Schreibvorgang in jedem Geschäft billiger ist als ein SMI. Ein Vergleich von Baseballstadion und Größenordnung wäre interessant.
Diese Fragen sind alle eng miteinander verbunden, aber ich kann sie aufteilen, wenn es nicht so viele Überschneidungen gibt, wie ich erwartet habe.
perf
da Linux noch nicht gebootet ist. Die Bewertung der SMI-Latenz (System Management Interrupt) auf einem Linux-CentOS / Intel-Computer enthält einige Details zum Zählen von SMIs.
MSR_SMI_COUNT=0x34
ohne vorher einen Zähler programmieren zu müssen.