2013-08-28 8 views
6

Motivation - Schreiben Sie ein Programm in C (und Assembly, falls erforderlich), um einen rechteckigen Bereich im Bildschirm rot zu färben.Was ist die absolut niedrigste Stufe der Zeichnungsabstraktion in GNU/Linux?

STRICT Anforderungen - GNU/Linux läuft mit den minimalen Dienstprogramme und Schnittstellen in Text/Konsole Modus. Also kein X (oder gleichwertig wie Wayland/Mir), keine nicht standardmäßigen (außerhalb des POSIX, LSB usw.) vom Kernel bereitgestellten Bibliotheken oder Schnittstellen und keine zusätzlichen Annahmen außer dem Vorhandensein des Gerätetreibers für den Monitor.

Effektiv, was ich suche, ist Informationen darüber, wie man ein Programm schreibt, das schließlich ein Signal über den VGA-Port und Kabel an den Monitor sendet, um einen bestimmten Teil des Bildschirms rot zu färben.

Entschuldigung, wenn das unhöflich klingt, aber nein "Warum willst du das tun?" oder "Warum benutzt du keine ABC-Bibliothek?" Antworten. Ich versuche zu verstehen, wie man zum Beispiel eine Implementierung des X-Servers oder eine Kernel-Framebuffer (/ dev/fb0) -Bibliothek schreibt. Es ist in Ordnung, eine Verbindung zur Quelle einer C-Bibliothek herzustellen.

+2

http://wiki.osdev.org/VGA_Hardware – Joe

+1

[OpenGL] (http://www.opengl.org/) ist, wie der Name schon sagt, geöffnet. Ich nehme an, Sie finden vielleicht einen Hinweis darauf, was Sie dort machen wollen. Es ist ein sehr niedriger Pegel, d. H. Punkte, Linien, Dreiecke, Farben. Der Quellcode sollte Ihnen helfen, ein Beispiel zu sehen, wie diese Bibliothek funktioniert, und es gibt eine große Menge an Dokumentation. [Siehe hier] (http://stackoverflow.com/questions/3352648/where-can-i-download-source-code-of-opengl) für Quellcode-Möglichkeiten. – ryyker

+2

Es geht darum, mit sehr unterschiedlichen Grafikkarten umzugehen. AFAIK, ist die gemeinsame Teilmenge VGA, die heute veraltet ist (zu kleine Auflösung, etc ...). Sie müssen in Hardware-spezifische Sachen tauchen, und der Schmerz beginnt dort .... Wayland oder X bietet Ihnen eine gemeinsame Abstraktion, um mit verschiedenen Grafikkarten umzugehen .... –

Antwort

1

keine zusätzlichen Annahmen außer dem Vorhandensein des Gerätetreibers für den Monitor.

Das bedeutet, dass Sie X oder Wayland verwenden können, da dies die Grafiktreiberinfrastruktur unter Linux ist.

Linux (der Kernel) selbst enthält keine Grafikgrundelemente. Es stellt einige Schnittstellen zur Verfügung, um mit der GPU zu kommunizieren, Speicher darauf zuzuweisen und den On-Screen Framebuffer zu konfigurieren. Aber außer dem rohen Framebuffer-Speicherzugriff hat der Linux-Kernel keine Möglichkeit, Zeichenoperationen auszuführen. Dafür benötigen Sie eine Infrastruktur im Benutzerbereich.

Wayland baut auf DRI2 auf, das wiederum mit der DRM Kernel-API kommuniziert. Dann benötigen Sie einen GPU-abhängigen Status-Tracker. Mesa verfügt über Status-Tracker für eine Reihe von GPUs und bietet OpenGL- und OpenVG-Frontends.

Die NVidia- und ATI-proprietären Closed-Source-Grafiktreiber sind nur für die Verwendung mit X ausgelegt. Also mit denen, um die GPU zu verwenden, müssen Sie X verwenden. So ist es.

Außerhalb davon können Sie den On-Screen Framebuffer-Speicher durch /dev/fbdev manipulieren, aber das ist nur pixel pushen, ohne jede GPU-Beschleunigung.

+0

Also, wenn ich die Kommentare zu der Frage und dieser Antwort verarbeite, schließe ich das. Theoretisch kann ich "einige Schnittstellen verwenden, um mit der GPU zu sprechen, Speicher darauf zuweisen und den On-Screen-Framebuffer konfigurieren", um meine eigene Display-Infrastruktur oder meine eigene OpenGL-ähnliche Bibliothek ** GPU-abhängig ** zu erstellen. Ich kann auch/dev/fbdev ohne Vorteile der GPU-Beschleunigung verwenden. Praktisch würde ich den Grafiktreiber verwenden, aber der Treiber der wichtigsten Hersteller ist abhängig von X. Eine kurze letzte Frage - wie erstellt Ncurses GUI-ähnliche Schnittstellen im Konsolenmodus? –

+2

@MozanSykol: Ja, das ist im Wesentlichen wie es funktioniert. Nun, Ncurses verwendet den normalen Textmodus. Die Konsole ist ein N × M-Raster von Zeichen und Attributen (Farbe, Hintergrund, Blinken). Ein guter alter VGA unterstützt dies direkt, d. H. Indem die richtigen Werte an der richtigen Stelle des Speichers geschrieben werden, wird eine VGA-kompatible Grafikkarte den Text entsprechend zeichnen. Wenn VGA nicht verfügbar ist, kann der Linux-Kernel dies über den Raw-Framebufferspeicher ('/ dev/fbdev') emulieren. Aber der Textmodus kann keine schicke Grafik machen. – datenwolf

1

Es war einmal wir hatten svgalib (oder hieß es vgalib?), Die genau das taten, was Sie versuchen zu tun. Ich würde empfehlen, dass Sie sich den Quellcode ansehen. Ich weiß nicht, ob es immer noch möglich ist, es irgendwo zu finden, oder ob es tatsächlich mit einem modernen Kernel funktionieren würde. Was auch immer Sie tun, seien Sie bereit, oft neu zu starten.

+1

SVGALib sieht nützlich aus. Wikipedia behauptet, dass es als ein Treiber für SDL verwendet werden kann, aber Wikipedia ist oft irreführend in Sachen Programmierung. Müssen Sie experimentieren, um herauszufinden, ob es funktioniert. –

Verwandte Themen