Sonntag, Dezember 15, 2019

Wie wird die Anbindung der Grafikkarte mit C oder C++?

Bibliotheken wie OpenGL Zugriff auf die Grafikkarte und kann zu Grafik-Programmen, wie funktioniert diese Bibliotheken den Zugriff auf die Grafikkarte, da Sie realisiert C. Nach dem, was ich gehört habe, C und C++ bieten keine Grafik-Funktionen in die Sprache und die Herstellung von Grafiken erforderlich Bibliotheken. Wie dann sind diese Bibliotheken, die in C geschrieben? Die gleiche Frage gilt für den sound auch?

Sind zusätzliche Funktionen für C/C++ – Sprachen, wie z.B. Grafik, sound, internet-Zugriff geschrieben, im niedrigeren level-Sprachen und C/C++ mit Bibliotheken?

Ich wäre dankbar für jede Zusammenfassung, die richtige, meine Konzepte, oder alle vorgeschlagenen Lesungen auf dem web oder Büchern.

InformationsquelleAutor Amir Nasr | 2011-11-01

2 Kommentare

  1. 22

    OpenGL ist nicht wirklich eine Bibliothek. Es ist eine Spezifikation. Die opengl32.dll oder libGL.so haben Sie auf Ihrem system sind nur sehr dünne Schichten, die die Kommunikation mit der GPU-Treiber.

    Nach dem, was ich gehört habe, c und c++ bieten keine Grafik-Funktionen in die Sprache und die Herstellung von Grafiken erforderlich Bibliotheken. Wie dann sind diese Bibliotheken, die in c geschrieben?

    Das Betriebssystem bietet Funktionen, um mit der hardware kommunizieren. Ein Treiber verwendet, diese Einrichtungen zu fahren (daher der name) die hardware. Zum Beispiel das schreiben einer Sequenz A, B, C, D kann einige bestimmte GPU-zeichne ein Dreieck in den framebuffer.

    Erklärte ich diese Dinge schon in Auf Windows, wie funktioniert OpenGL unterscheiden sich von DirectX? und hier Wie funktioniert OpenGL arbeiten auf der untersten Ebene? (ich bin auch ein wörtliches Zitat hier):

    Diese Frage ist fast unmöglich zu beantworten, weil OpenGL von selbst
    ist nur ein front-end-API, und solange eine-Implementierungen hält
    die Spezifikation und das Ergebnis entspricht diesem es kann getan werden, alle
    so, wie Sie wollen.

    Stellt sich vielleicht die Frage gewesen: Wie sieht ein OpenGL-Treiber auf die
    niedrigste Stufe. Nun ist dies wieder unmöglich zu beantworten, im Allgemeinen, als
    Treiber ist eng gebunden an irgendein Stück der hardware, die möglicherweise wieder tun
    Dinge aber der Entwickler es entworfen hat.

    Also die Frage sollte sein: „Wie sieht es denn im Durchschnitt hinter
    die Szenen von OpenGL und die Grafik-system?“. Schauen wir uns diese
    von unten nach oben:

    1. Auf der untersten Ebene gibt es einige Grafik-Gerät. Heutzutage sind GPUs bieten eine Reihe von Registern, die deren Betrieb Steuern
      (welche Register genau ist Gerät abhängig) haben einige Programm-Speicher
      für Shader, bulk memory für input-Daten (vertices, Texturen, etc.) und
      I/O-Kanal, um den rest des Systems, über die es empfängt/sendet
      Daten-und Befehls-streams.

    2. Den Grafik-Treiber merkt sich die GPUs Zustand und alle Ressourcen, die Anwendungsprogramme auf, die mit der GPU. Auch ist es
      verantwortlich für die Konvertierung oder sonstige Verarbeitung der Daten, die gesendet werden durch
      Anwendungen (konvertieren von Texturen in das pixelformat unterstützt durch die
      GPU -, Shader kompilieren in Maschinencode der GPU). Des weiteren
      bietet einige abstrakte, Fahrer-dependent interface der Anwendung
      Programme.

    3. Dann gibt es die Fahrer angewiesen OpenGL client-Bibliothek/Treiber. Unter Windows wird geladen durch proxy durch opengl32.dll auf Unix
      Systeme dieser befindet sich an zwei Orten: * X11-GLX Modul und Treiber
      abhängig GLX-Treiber * und /usr/lib/libGL.so enthalten einige Treiber
      abhängige Sachen für direct rendering

      Auf MacOS X dies geschieht, werden die „OpenGL Framework“.

      Es ist dieser Teil, der übersetzt OpenGL-Aufrufe, wie Sie es tun in Aufrufe
      der Treiber bestimmte Funktionen in dem Teil des Treibers beschrieben
      in (2).

    4. Schließlich die eigentliche OpenGL-Bibliothek, opengl32.dll in Windows und auf Unix /usr/lib/libGL.so; dieser meist gerade geht nach unten die Befehle
      um die OpenGL-Implementierung die richtige.

    Wie die eigentliche Kommunikation geschieht, kann nicht verallgemeinert werden:

    In Unix 3<->4-Verbindung kann geschehen entweder über Buchsen (ja, es
    Mai, und geht über das Netzwerk, wenn Sie möchten) oder durch Gemeinsame
    Speicher. In Windows die interface-Bibliothek und der Fahrer client sind
    beide laden in der Prozess-Adressraum, so dass nicht so viel
    Kommunikation, sondern einfache Funktionsaufrufe und Variablen/pointer übergeben.
    Bei MacOS X ist dies ähnlich wie Windows, nur, dass es keine Trennung
    zwischen OpenGL-Schnittstelle und Treiber-client (das ist der Grund, warum
    MacOS X ist so langsam, Schritt zu halten mit neuen OpenGL-Versionen, ist es immer
    erfordert eine vollständige Aktualisierung des Betriebssystems zu liefern, die neue
    framework).

    Kommunikation zwischen 3<->2 kann durch gehen, ioctl, read/write, oder
    durch die Zuordnung von Speicher in Prozess-Adressbereich und konfigurieren
    die MMU ausgelöst einige Treiber-code, Wann immer eine änderung, dass der Speicher
    sind getan. Dies ist ziemlich ähnlich, auf jedem Betriebssystem, da Sie
    immer muss über den kernel/userland-Grenze: Letztlich gehen Sie
    durch einige syscall.

    Kommunikation zwischen system und GPU geschehen durch die periphial bus
    und die Zugriffsmethoden definiert, also PCI, AGP, PCI-E, etc, die Arbeit
    über Port-I/O -, Memory-Mapped I/O, DMA, IRQs.

    Update

    Beantworten, wie man Schnittstellen der hardware, die von einem C-Programm sagen, dass ein Betriebssystem-kernel und/oder Treiber, die in C geschrieben:

    C-standard selbst behandelt-Adressen als etwas rein abstraktes. Können Sie werfen einen Zeiger auf uintptr_t, aber der numerische Wert, den Sie bekommen, ist nur erforderlich, um zu haften Zeiger-Arithmetik, wenn die Darsteller wieder auf den Zeiger. Ansonsten kann der Wert nicht auf Adressraum. Die einzig sichere Art und Weise zu implementieren, die den Zugriff auf die hardware zu C ist durch das schreiben der untersten Ebene Zeug in der Montage, nach dem ABI des verwendeten C-Implementierung und-system.

    Das ist, wie alle richtigen OS tun es. Nie-Adressen Umwandlung in Zeiger in C! Das Betriebssystem implementiert hat, diese in assembler, abgestimmt auf den C compiler des Systems. Der code in der assembly exportiert Funktionen aufrufbar, die in C. stellt Der kernel diese Funktionen, dann den GPU-Treiber. Also die Kette ist:

    Application Program → [OpenGL-API-Schicht → Lieferant OpenGL-Implementierung] → GPU-Treiber → OS-kernel → Hardware.

  2. 3

    Wenn ich mich nicht Irre, haben Sie die Frage hinausläuft, wie macht man mit C auf hardware zugreifen. Die Antwort, in einem sehr Allgemeinen und hand wellenförmigen Mode, ist, dass Peripherie-hardware ist oft abgebildet in den Adressraum und auf die zugegriffen werden, als ob es normale Speicher mit dem VORBEHALT, dass es unerwartet ändern.

    C macht einen guten job, der Zugriff auf den Speicher, so ist es völlig geeignet für das Lesen und schreiben direkt mit der hardware. Die volatile Stichwort ist dort explizit stoppen der compiler durch die Einnahme von short cuts und Kraft Abfrage der Adressen in Frage. Dies ist, da memory-mapped IO-Adressen kann sich unerwartet ändern und Verhalten sich nicht wie normale RAM.

    Auf ein einfaches system, dieses low-level-Speicher-Zugriff festlegen-Adressen werden abstrahiert, in eine leichter nutzbare Bibliothek. Bei modernen Betriebssystemen, kernel müssen vermitteln Zugang zu gemeinsamen Ressourcen wie eine Grafikkarte. Dies bedeutet, dass der kernel mit der Umsetzung des memory-mapped-IO, aber auch eine Reihe von system-calls (oft mit Swiss Army Knife Konstrukte wie ioctl), so dass ein Benutzer Zugriff auf die Peripherie. Diese wiederum verpackt in eine schöne benutzerfreundliche Bibliothek wie OpenGL.

    • Der C-standard selbst behandelt-Adressen als etwas rein abstraktes. Können Sie werfen einen Zeiger auf uintptr_t, aber der numerische Wert, den Sie bekommen, ist nur erforderlich, um zu haften Zeiger-Arithmetik, wenn die Darsteller wieder auf den Zeiger. Ansonsten kann der Wert nicht auf Adressraum. Die einzig sichere Art und Weise zu implementieren, die den Zugriff auf die hardware zu C ist durch das schreiben der untersten Ebene Zeug in der Montage, nach dem ABI des verwendeten C-Implementierung und-system. Das ist, wie alle richtigen OS tun es. Nie-Adressen Umwandlung in Zeiger in C!
    • Ja, das casting von ints in Pointer ist Undefiniertes Verhalten in C; doch viele Compiler wird zu etwas „nützlich“ in diesem Fall, und Programmierer nutzen diese Tatsache. So können Sie (und einige Leute tun) „cast-Adressen in Zeigern“ – es ist nur compiler – und OS-abhängig, wie/ob das funktioniert (wie assembler).
    • Casting-ints in Pointer ist nur ein Undefiniertes Verhalten, wenn der int ist nicht das Ergebnis einer vorherigen Zeiger auf int casten. Trotzdem, der numerische Wert des pointers casten zu int nicht definiert wird straigtforward. Es gibt zum Beispiel Architekturen, die ein spezielles bit-Muster für den NULL-Zeiger. Der C-standard allerdings erfordert diese Maschine bit-Muster mit dem numerischen Wert 0 in einem C-programm (das #define NULL 0 makro ist nur für Liebhaber des Schreibens NULL ist, wird der numerische Wert immer 0 ist). Und ich kenne keine richtigen OS, wo die Implementierung der Besonderheiten genutzt werden. Sie alle nutzen asm.
    • Ein Hinweis auf die volatile Schlüsselwort. Während die pointer-Werte sind nicht erforderlich für die Zuordnung der Adressen ist es durchaus möglich, Rückgabe eines Zeigers einige Memory-Mapped IO (MMIO) Adresse Raum durch C Implementierung passende Assembler-code. Zugriff auf den Speicher durch das C-Zeiger werden natürlich alles tun MMIO, aber nur, wenn der compiler nicht optimiert es Weg. Das ist, wo volatile in das Spiel. Die OS gibt Ihnen einige Arbeitsspeicher, durch eine Funktion, die aufgerufen wird, die von C, aber letztendlich landen im code, geschrieben in Assembler. Durch dieses Lotsen C-code tun können MMIO.

Kostenlose Online-Tests

Ihre Entwicklerrolle