INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

LV Handles



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

16.03.2009, 08:45
Beitrag #6

abrissbirne Offline
LVF-Stammgast
***


Beiträge: 480
Registriert seit: Aug 2007

LV2009, LV2010
2007
EN

66123
Deutschland
LV Handles
' schrieb:Also x86 Prozessoren haben sogenannte Rings. Alles was hier folgt ist aus meiner Erinnerung und schon einige Zeit alt und könnte deswegen in Details nicht ganz richtig sein, aber im Grossen und Ganzen sollte es die Wirklichkeit beschreiben.
Die x86 CPU hat 4 Ringe wenn ich mich nicht irre. Ein Betriebssystem kann nun bestimmte Operationen, Speicherzugriffe etc. an verschiedene Rings zuweisen. Ring 1 ist der meist privilegierte und Ring 4 der am Geringsten. Windows verwendet nur Ring 1 für den Kernel und Ring 3 für den User Space.

Speicher wird durch eine Speicherverwaltungseinheit verwaltet. Das ist ein Hardwareteil dass für jeden Prozess einen virtuellen (in Windows 32Bit auch linearen) Speicherbereich bereitstellt und diese an verschiedenen Orten im physikalischen Speicher mappt. Auch verwaltet sie das Paging des Speichers. Das heisst länger nicht gebrauchte physikalische Speicherbereiche werden mittels Interrupt zum OS ausgelagert um Platz zu machen für andere Applikationen. Wenn jetzt eine Applikation auf eine lineare Adresse zugreifen will die ausgelagert wurde merkt das die Speicherverwaltungseinheit und macht einen Interrupt zum OS um den entsprechenden Bereich wieder in den physikalischen Speicher zu laden. Obwhol ein Prozess einen linearen Speicherbereich sieht kann der entsprechenden Bereich im physikalischen Speicher wild durcheinander liegen da das OS mit sogenannten Pages arbeitet (ich glaube 4K gross unter Windows aber kann auch grösser sein) die immer als Ganzes verwaltet werden.

Zugriff auf die entsprechenden Selector Register um die lineare Adresse innerhalb eines Prozesses auf die physikalische Adresse zu übersetzen ist auch nur im Kernel möglich, wie auch die Ausführung bestimmter Opcodes, so auch beispielsweise inp und outp um auf IO Port Adressen zuzugreifen (ausser man verändert die IO Permission Map so dass inp und outp auf die entsprechenden Adressen keine Exception erzeugen wenn innerhalb des User Spaces ausgeführt). Dies nur mal eine Information am Rande ^_^

Ob PHYSICAL_ADDRESS in Deinem API wirklich phyikalische Speicheradressen bedeutet, kann ich Dir nicht sagen, Es kann sein dass der Programmierer da irgendwie etwas anderes meinte. An sich macht es nicht so viel Sinn um auf einem User Space API die Möglichkeit zu bieten eine wirkliche physikalische Adresse anzugeben.

Informationen zur Speicherverwaltung mit x86 CPUs findest Du in den entsprechenden Hardwarereferenzmanuals dieser Prozessoren Achtung das ist schwere Materie sowohl physikalisch schwer (die entsprechenden Manuals können Dein Büchergestell ziemlich belasten) als auch theoretisch.Big Grin

Rolf Kalbermatter
Jo, das klingt doch als würde es etwas länger dauern bis man durchsteigt. Ich habe die Beschreibung nochmal durchforstet und poste mal die Möglichkeiten für das Control Flag:
HOST_ADDRESS:
Specifies that DataPtr is a logical address that points to the data. Specifies that DataPtr is a logical address that points to the data ...

Note that when using logical addresses, memory protection errors could result.


PHYSICAL_ADDRESS:
Specifies that DataPtr is a physical address that points to the data ...

Note that using physical addresses provides direct access to any of your computer's memory mapped devices.

Specifics
This setting must be used for all buffers with the AQUIS attribute.

Ich muss doch den Parameter PHYSICAL_ADDRESS wählen, da ich ja daten erfassen möchte (Attribut AQUIS). Ich habe aber trotzdem schon den ein oder anderen schönen Bluescreen erzeugt Pccrash
Also scheine ich bei der Übergabe etwas falsch zu machen und die Funktion möchte in den falschen Speicherbereich schreiben. Damit wäre ich wieder bei dem Punkt wie ich den richtigen Adressbereich aus dem Handle ziehe. ODer liege ich mit meiner Einschätzung komplett daneben?

THX
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Nachrichten in diesem Thema
LV Handles - abrissbirne - 11.03.2009, 13:53
LV Handles - abrissbirne - 11.03.2009, 16:46
LV Handles - rolfk - 11.03.2009, 19:44
LV Handles - abrissbirne - 11.03.2009, 22:06
LV Handles - rolfk - 12.03.2009, 09:49
LV Handles - abrissbirne - 16.03.2009 08:45
LV Handles - rolfk - 16.03.2009, 10:16

Gehe zu: