Anfängerfrage: Woher kennt eine Klasse den Adressbereich einer Grafikkarte?

kalle51

Aktives Mitglied
Thread Starter
Dabei seit
24.08.2005
Beiträge
129
Reaktionspunkte
0
Hi Leute, mal eine ganz dumme Frage! Woher kennt eine Klasse (z.B. von Cocoa) den Adressbereich einer Grafikkarte, fängt der bei allen Grafikkarten an der gleichen Stelle an? Kann doch eigentlich nicht, kommt doch darauf an wieviel RAM man im Rechner und in der Grafikkarte hat? Gibt es ein Befehl um den Adressbereich der Grafikkarte zu bekommen? Bitte habt Verständnis für meine Frage, meine Programmiererfahrung beruht noch auf dem Atari,C64 und Amiga! In meiner PC Zeit habe ich mich nicht damit beschäftigt, man hatte genug mit der Kiste zu tun um sie am "laufen" zu halten!
Gruß Kalle
 
kalle51 schrieb:
Hi Leute, mal eine ganz dumme Frage! Woher kennt eine Klasse (z.B. von Cocoa) den Adressbereich einer Grafikkarte, fängt der bei allen Grafikkarten an der gleichen Stelle an? Kann doch eigentlich nicht, kommt doch darauf an wieviel RAM man im Rechner und in der Grafikkarte hat?

Moderne Rechner arbeiten in dieser Hinsicht *vollständig* anders, als Du denkst. Stichwort virtueller Speicher.

Moderne Grafikkarten arbeiten in dieser Hinsicht *vollständig* anders, als Du denkst. Auf den RAM der Grafikkarte kann in der Regel nicht direkt zugegriffen werden und ich wüsste auch nicht, welchen Sinn das hätte, es seidenn Du hättest ein Dokument in dem steht wie die Karte ihren RAM verwaltet.

Unter Mac OS X kannst Du die Grafikkarte nicht selbst ansteuern, da das Superuser-Privilegien erfordert. Wenn Du Grafik schnell darstellen willst, arbeite Dich in OpenGL ein. Außerdem ist es nicht gerade guter Stil, soetwas selbst zu machen.
 
Zuletzt bearbeitet:
Mir ist schon klar, daß man nicht direckt auf den Grafikspeicher zugreifen kann. Aber wenn ich z.B. eine Cocoa Klasse benutze die ein Fenster darstellt, muß doch irgendwo definiert sein wo diese Grafikinformationen hingeschrieben werden müssen - oder? Unter virtuellem Speicher verstehe ich das Auslagern von Prozessen auf die Festplatte, wenn der RAM Bereich nicht ausreicht!
Gruß Kalle
 
kalle51 schrieb:
Aber wenn ich z.B. eine Cocoa Klasse benutze die ein Fenster darstellt, muß doch irgendwo definiert sein wo diese Grafikinformationen hingeschrieben werden müssen - oder?

Das macht das Betriebssystem für Dich. Cocoa-Fenster haben sogar per Default double buffering eingeschaltet. Du musst also wirklich nur mit den üblichen Zeichenaufrufen reinmalen.

Unter virtuellem Speicher verstehe ich das Auslagern von Prozessen auf die Festplatte, wenn der RAM Bereich nicht ausreicht!

Dann bist Du, auf die Windows-Welt bezogen, ca. 10 Jahre hinterher, und auf die UNIX-Welt bezogen noch etwas mehr. Prozessortechnisch gesehen bist Du auf einem Stand eines 80286. In Ataris gesprochen entspricht das einem der Rechner älter als dem TT030.

Heutzutage ist es durch virtuelle Speicherverwaltung möglich, dass a) alle Prozesse den exakt selben Adressraum für völlig verschiedene Daten benutzen können, b) dadurch alle Prozesse den vollen Adressraum nutzen können, und c) das Auslagern von nicht benutzten Speicherseiten als Nebeneffekt.
 
Ich bin sicher das ist mehr Informationen als ihr hören wollt, aber ganz tief unten macht ein Treiber ein Mapping. Der Treiber weiss, wo der Speicher der Grafikkarte ist. Diesem reellen Speicher auf der Karte kann dann ein virtueller Speicher im Adressbereich des Rechners zugewiesen werden.

Aber wenn Du nicht gerade Treiber für Grafikkarten schreibst kann Dir das tatsächlich herzlich egal sein. Und wie schon gesagt, in diesen Speciher dürftest Du ohnehin nur mit root Rechten schreiben. CoreImage treibt die Abstraktion sogar noch eine Stufe höher und erlaubt Dir, in der OpenGL Shading Language Filter zu definieren, ohne das Instruction Set der Karte zu kennen.

Gruss

Alex
 
Danke, aber genau das wollte ich wissen. Dann müste doch der virtuelle Adressbereich der Klasse bekannt sein? Steht dann so ein "Funkionsaufruf" in der Klasse die z.B. ein Fenster definiert, dass müsste man dann doch in einer Headerdatei finden - oder?
Gruß Kalle
 
Okay, Du wolltest es doch nicht wissen... Du bist sowas von auf der falschen Schiene...
 
So, zu meinem Verständnis gehört das nun mal. Früher hat man bei einem C64 direkt in den Grafikspeicher geschrieben, um eine schnellere Grafik zu bekommen. Heute ruft man Klassen(Objekte) auf, z.B. eine Klasse die mir ein Fenster "malt". Nun muss doch diese Klasse den Adressbereich - ob nun real oder virtuell - kennen. Wenn nun der Grafiktreiber den realen Adressbereich in einen virtuellen Adressbereich des Rechner mappt, muss doch die Klasse die das Fenster mal diesen auch kennen - oder?
 
Der Virtuelle Speicher macht quasi alles zu einem riesigen Fließband, wo jeder was reinschreiben kann... Siehe auch virtuelle Adressierung...

Ansonsten schau nochmal nach, was ein Framework ist ;)
Um genau solche Direktzugriffe zu vermeiden, existiert das Cocoa Framework überhaupt :)

Abgesehn davon gestaltet sich OSX wie ein großes Videospiel, da der Bildaufbau über Core2D/3D Schnittstelle an dessen Ende OpenGL sitzt (Überspitze Darstellung der Tatsachen ;) )
 
kalle51 schrieb:
So, zu meinem Verständnis gehört das nun mal. Früher hat man bei einem C64 direkt in den Grafikspeicher geschrieben, um eine schnellere Grafik zu bekommen.

Nach genau dem Wissensstand klingen Deine Fragen ja auch... was soll ich noch viel mehr sagen als dass Du den mal updaten sollst?

Heute ruft man Klassen(Objekte) auf, z.B. eine Klasse die mir ein Fenster "malt". Nun muss doch diese Klasse den Adressbereich - ob nun real oder virtuell - kennen.

Heutzutage ist es um ein paar Ebenen komplizierter.

Erstens wird der gemappte Adressbereich nicht unbedingt benutzt, damit der Rechner irgendwas direkt in den Grafikkartenspeicher schreibt, sondern zur Kommunikation.

Zweitens kennt eine typische Fenster-Klasse keine Details des Ausgabegerätes sondern kann ihre Darstellung durchaus ganz anders ablegen als die Grafikkarte das machen würde.

Quartz setzt die ganzen rechteckigen oder sonsteckigen Fensterblöcke im Ausgangsbild zusammen. Quartz greift auch nicht direkt auf den Kartenspeicher zu, sondern benutzt OpenGL.

OpenGL ist immernoch nicht hardwareabhängig. Von hier aus geht es entweder weiter zur Grafikkarte, die OpenGL selbst versteht (alle Mac-Grafikkarten können das), oder zu einem Software-Renderer wie Mesa, der die Aufrufe umsetzt und die Grafikkarte dann am Ende anders anspricht, oder oder oder.


Wenn Du heute schnellere Grafikausgabe willst dann lern OpenGL. Selbst in den Kartenspeicher schreiben ist, wenn Du es überhaupt schaffst, langsamer, weil die (beachtliche) Rechenleistung der GPU nicht mehr dafür zur Verfügung steht.
 
dannycool schrieb:
Erstens wird der gemappte Adressbereich nicht unbedingt benutzt, damit der Rechner irgendwas direkt in den Grafikkartenspeicher schreibt, sondern zur Kommunikation.
Richtig. Und das sagt einer, der schon mal PCI Treiber für OS X geschrieben hat.
dannycool schrieb:
Wenn Du heute schnellere Grafikausgabe willst dann lern OpenGL. Selbst in den Kartenspeicher schreiben ist, wenn Du es überhaupt schaffst, langsamer, weil die (beachtliche) Rechenleistung der GPU nicht mehr dafür zur Verfügung steht.
Auch richtig.

Im übrigen war der C64 ein homogenes System, d.h. da war die Hardware immer gleich. Und natürlich hatte der C64 nichts, was man als GPU bezeichnen könnte.

Gruss

Alex
 
kalle51 schrieb:
In meiner PC Zeit habe ich mich nicht damit beschäftigt, man hatte genug mit der Kiste zu tun um sie am "laufen" zu halten!
Gruß Kalle
Ist das nicht eine arg faule Ausrede?
Oder ist das so der Willkommensgruß, damit man dir auch wohl gesonnen ist?
Ich verwende beides, mein PB momentan etwas lieber, aber das liegt eigentlich eher an den kleinen Details wie Umgebungsprofilen etc.
Mit der Stabilität war ich bei WinXP äußerst zufrieden!
 
Man beachte meine Überschrift, die da beginnt: Anfängerfrage .....! Ich habe nichts mit C oder Objective-C zu tun. Ich wollte mich damit mal beschäfigen, dass ich hier im falschen Forum bin, wuste ich nicht! Habe irgendwie nichts von "nur für Profis " gelesen!
Also entschuldigt bitte diese "dumme" frage und danke noch mal für die Antworten.
Gruß Kalle
 
kalle51 schrieb:
Ich wollte mich damit mal beschäfigen, dass ich hier im falschen Forum bin, wuste ich nicht! Habe irgendwie nichts von "nur für Profis " gelesen!

Was soll das nun wieder heißen? Du hast eine unsinnige Frage gestellt, man hat Dich darauf hingewiesen, Du hast sie nochmal gestellt, man hat Dich nochmal darauf hingewiesen, Du hast sie nochmal gestellt, Du hast eine Antwort bekommen und falsch interpretiert, man hat Dich wieder darauf hingewiesen dass das anders läuft und erklärt wie, und jetzt wirst Du patzig?
 
Hallo Kalle,

Gibt es ein Befehl um den Adressbereich der Grafikkarte zu bekommen?
Ja. IOService::getDeviceMemoryWithIndex oder IOPCIDevice::getDeviceMemoryWithRegister. Diese Befehle stehen Dir aber nur als Kernel Extension zur Verfügung, und da Du betont sagst, eben kein Profi zu sein werden sie Dir also nichts nützen. Und selbst wenn: Reinschreiben solltest Du da nur was, wenn Du GANZ GENAU weisst was Du da machst.

Den Ton Deines nächsten Postings verstehe ich nicht ganz, denn wenn Du Dich "mal damit beschäftigen wolltest" haben Dir hier ein paar Leute sehr aufschlussreiche Antworten gegeben.
Wenn Dir die Antworten zu "professionell" waren, dann weiss ich's auch nicht :(

Gruss

Alex
 
Entschuldigt bitte meine didaktische Entgleisung! Ich werde mich jetzt intensiver mit den Grundlagen beschäftigen, an den es doch wohl arg mangelt, Apple bietet da ja jede Menge Information. Nochmals danke für die Antworten!

Gruß
Kalle
 
Zuletzt bearbeitet:
Zurück
Oben Unten