Grafikkartentreiber: Wessen Fehler?

Der kürzlich erschienene Artikel "Ein Fehler im Grafikkartentreiber kann das Inkognito-Surfen aufdecken " veranlasste die Vorbereitung dieses Materials . Dieser Artikel wurde nach der Veröffentlichung der trivialen Methode zur Anzeige eines Bildes erstellt, das zu einem (einschließlich abgebrochenen) Prozess gehört und möglicherweise sogar den Anspruch hat, Informationen zu schützen.

Da ich zufällig auch an der Entwicklung von Grafiktreibern beteiligt bin, werde ich versuchen, kurz zu erklären, womit der Autor des ursprünglichen Fehlerberichts falsch ist, welche Verantwortung das Problem hat und wie es gelöst werden kann.



Unabhängig vom Betriebssystem, den zugehörigen System-APIs und Anwendungsschnittstellen für die Entwicklung von Grafikanwendungen löst ein beliebiger Grafikkartentreiber die folgenden systemweiten Aufgaben:

  • Initialisierung des Display-Controllers ( Einstellen des Videomodus, Verwalten der GPU-Ports, Erstellen eines / mehrerer unabhängiger Bilder, ... );
  • Adressierbare Speicherverwaltung ( Befehlswarteschlangen, lineare / Kacheladressierung, Oberflächenzuweisung, Adressübersetzungstabellen, PCI-Aperturerweiterung, ... );
  • 2D-Beschleunigung ( Cursor, Hardware-Ebenen, Alpha / Chroma-Tasten, ROP, Grundelemente, ... );
  • 3D-Beschleunigung ( OpenGL, OpenGL ES / EGL, OpenVG / EGL, OpenCL, Open * );
  • Videodekodierung / Audiowiedergabe / EDID-Subtraktion / Bildpufferkomprimierung, ...

Die Lösungsansätze für die in jeder Phase angewandten Aufgaben wurden lange Zeit auf etablierte Praktiken reduziert. Dies erklärt nur die Reproduzierbarkeit des angegebenen Problems auf Geräten verschiedener Hersteller. Mit Blick auf die Zukunft kann ich sagen, dass Sie einen ähnlichen Effekt auf Intel-Controller erzielen können. Der Autor des Fehlerberichts hat im Rahmen der Lösung des Problems, bei dem der Effekt auftritt, absolut genau bestimmt - adressierbare Speicherverwaltung.



Speicherverwaltung


Die Hauptentität, die der Fahrer in dieser Phase betreibt, ist die Oberfläche. Eine Oberfläche wird im Allgemeinen als kontinuierliches Video oder RAM bezeichnet, das von einer Anwendung zur Erzeugung eines Bildes verwendet wird. Für Controller, die keinen eigenen Speicher haben, kann eine aus dem RAM zugewiesene Ressource über eine Adressübersetzungstabelle (Graphics Translation Table, GTT) adressierbar werden. Andernfalls kann das Bild nur angezeigt werden, wenn die Oberfläche in den Videospeicher kopiert wird, entweder mithilfe des DMA-Controllers (falls vorhanden) oder aufgrund von CPU-Ressourcen.

Tatsächlich steuern selbst Steuerungen mit ihrem eigenen diskreten Speicher in den meisten Fällen diesen auch über GTT, da auf diese Weise in Analogie zum TLB des Zentralprozessors ein virtueller Adressraum erstellt werden kann, um eine lineare oder Kacheladressierung bereitzustellen. Die Adressierungsmethode bestimmt jeweils den Treiber und es gibt keinen grundsätzlichen Unterschied zwischen ihnen im Rahmen dieses Artikels.

Beispiel für die Kacheladressierung im Videospeicher aus dem Quellartikel
Bild

Der Grafikcontroller-Treiber ist die Schnittstelle für das Betriebssystem zur GPU-Funktionalität, nichts weiter. Alle Aufgaben zur Gewährleistung des Informationsschutzes sind jeder dafür zuständigen höheren Ebene zugeordnet. Dafür verfügen die Treiber über alle verfügbaren Funktionen, es besteht der Wunsch, diese zu nutzen.

Auf Anfrage eines Client-Treibers reserviert das Betriebssystem eine Reihe von Oberflächen dafür (weist sie zu). Da nach Angaben des Autors eine Fragmentierung des Bildes relativ selten ist, können wir argumentieren, dass die Kacheladressierung in diesen Fällen nicht häufig verwendet wird. Bei der linearen Adressierung ist jede Oberfläche hauptsächlich durch einen Versatz vom Beginn des virtuellen Adressraums des Controller-Speichers gekennzeichnet. Bei der Zuweisung von Speicher gibt der Treiber dem Betriebssystem genau diesen Offset zurück, der einem freien Speicherblock entspricht, der die Oberfläche mit den von der Anwendungssoftware angeforderten Eigenschaften aufnehmen kann. In diesem Fall führt der Treiber nur die folgenden Aktionen aus: Ändert GTT für die weitere Verwendung virtueller Speicherseiten, überwacht die Einhaltung der Anforderungen für die Ausrichtung physischer Adressen;definiert den Mechanismus des Zugriffs von Anwendungssoftware auf die Oberfläche (PCI / GPU-Apertur, durch physikalische Adresse außerhalb der Apertur, GTT-Erweiterung im laufenden Betrieb), reserviert einen Teil des Speichers für seine eigenen Bedürfnisse.

Basierend auf dem Vorstehenden können wir schließen, dass mit Informationen über die Gesamtmenge des verfügbaren Reglerspeichers und die erforderlichen Oberflächeneigenschaften die Versatzbestimmung für alle Regler einheitlich gelöst werden kann. In der Praxis ist dies der Fall (basierend auf den Erfahrungen mit verschiedenen Unix-ähnlichen Betriebssystemen): Das Betriebssystem bietet einen Systemdienst / eine Systembibliothek, in der eine Liste bereits verwendeter Speicherblöcke gespeichert ist, und ermöglicht es Ihnen, schnell den ersten verfügbaren Offset für die logische Sicherung in dieser Bibliothek zu berechnen. Gleichzeitig ermöglicht das Betriebssystem mit Informationen vom Treiber über den Mechanismus des Zugriffs auf den Speicherblock im Allgemeinen, dass Anwendungssoftware an denselben physischen Adressen von gemeinsam genutzten / sich überschneidenden Oberflächen gebildet wird.

Wenn der Fahrer die Oberflächen nicht explizit steuert, wie wird dann die Beschleunigung implementiert?
. - , , ( ), .

( ) , ( ), .




Zurück zum ursprünglichen Problem


Sicherlich haben zu diesem Zeitpunkt viele bereits erraten, worauf es bei der Kritik ankommt. Bei der Ausführung verschiedener Anwendungen fragt das Betriebssystem nach der Oberfläche des Grafiktreibers für deren Anforderungen und verwendet sie erneut, sobald der Speicher frei wird (Prozessbeendigung). Gleichzeitig kann der Treiber nicht erkennen, dass ein Speicherblock sofort zurückgesetzt werden muss, da er bestimmte Sicherheitsanforderungen hat und keine anderen Links enthält. Das Nullstellen des Speichers selbst ist eine triviale Aufgabe der Hardware, die ein Rechteck ausfüllt.

Tatsächlich ist der Test, der zum Veröffentlichen des Fehlerberichts geschrieben wurde, redundant. Im allgemeinen Fall (wenn der Videospeicher in eine PCI / GPU-Öffnung passt) sind für Unix-ähnliche Systeme keine Anwendungs-APIs erforderlich. Es reicht aus, / dev / mem über den Offset zu kontaktieren, der aus der Ausgabe des Dienstprogramms "lspci" bekannt ist.

Bei Intel-Controllern ist die Situation anders, aber nicht viel. Da der Controller keinen eigenen Speicher hat, wird GTT im laufenden Betrieb mit der Zuweisung von Speicher aus dem RAM gebildet. Bei der Neuzuweisung der Oberfläche ist die tatsächliche Position des RAM-Blocks möglicherweise nicht zufriedenstellend, da in diesem Fall der virtuelle Adressierungsmechanismus des Betriebssystems bereits eine entscheidende Rolle spielt.

Es gibt mehrere Lösungen, und ich glaube, dass die Schlussfolgerungen offensichtlich sein werden:
  • Alle Hersteller von Treibern müssen redundante Funktionen zum Speichern von Informationen über vorhandene Oberflächen implementieren (die Frage der Steuerung gemeinsam genutzter Oberflächen bleibt offen ).
  • Das Betriebssystem muss überwachen, ob diese oder jene Anwendung aufgeräumt werden muss ( dies ist entweder eine bestimmte Markierung der geschützten Oberflächen oder eine übermäßige Nullstellung von Oberflächen sowohl im RAM als auch im Videospeicher ).
  • Anwendungssoftware sollte nach sich selbst korrekt bereinigen, da sie behauptet, an der Informationssicherheit beteiligt zu sein.

Hoffe die Notiz war interessant.

Source: https://habr.com/ru/post/de389039/


All Articles