Virtueller Speicher



  • In manchen Adressbereichen gibt VirtualQuery eine NULL zurück. Die Funktion konnte also nicht korrekt ausgeführt werden. Insbesondere ist das in den Adressbereichen von PCI-Karten der Fall. Kann ich prinzipiell auf diese Bereiche gar nicht zugreifen? (Betriebssystem: Windows2000).



  • Hallo,

    das ist eine gute Frage, aber ich glaube das das nicht gehen wird, da ich was in der Doku über den Befehl gelesen habe, der wie folgd lautet:

    VirtualQuery

    The VirtualQuery function provides information about a range of pages in the virtual address space of the calling process.

    DWORD VirtualQuery(
    LPCVOID lpAddress, // address of region
    PMEMORY_BASIC_INFORMATION lpBuffer, // address of information buffer
    DWORD dwLength // size of buffer
    );

    Das würde heisen, daß man nur Zugriff auf den eigenen PRIVATEN adressraum hat und nicht in andere Prozesse zugreifen kann. So würde ich das verstehen

    Solltest Du aber was anderes darüber erfahren würde mich das sehr interessieren.

    Gruß Ken



  • Mit VirtualQuery kann man nur den User-Mode Address-Space bearbeiten, nicht den Kernel-Mode. Steht übrigens auch im MSDN:

    Passing a kernel-mode pointer to this function can result in no information being returned, due to security issues. In this case, the return value is zero



  • Hm, ist virtueller Speicher nicht ausgelagerter Speicher auf der Festplatte?
    Seit wann nutzen PCI-Karten sowas?



  • Nein. Im Protected Mode ist der ganze Speicher für normale Programme virtuell. Nur der Kernel kann mit physischen Adressen arbeiten, und das auch nur bedingt (selektor erstellen, und darüber dann drauf zugreifen).
    Der Clou bei dieser speicherverwaltung ist, dass es für ein programm unsichtbar ist, ob der Speicher (z.B. ein int*) gerade in einer Auslagerungsdatei auf der Platte oder physisch im RAM liegt. Sobald das Programm einen bestimmten Speicherbereich benötigt, der gerade auf der Platte liegt, lädt windows ihn eben dynamisch nach.

    Ich weiß nicht wie das bei PCI karten läuft, aber ich denke im protected mode dürfen die auch nicht auf physischen Speicher zugreifen. Also müsste auch der Speicher von PCI-Karten auslagerbar sein. Wenn nicht, wäre auch nicht schlimm: der Kernel kann bestimmte Speicher-Bereiche als "nicht auslagerbar" (non-pagable) kennzeichnen. Dann bleibt der Speicherblock immer im RAM.



  • Danke für die vielen Antworten,
    ich versuch mal das Problem etwas genauer zu schildern:
    der Speicher meiner PCI Karte wird in den virtuellen Speicher des PCs gemapped. Und zwar auf 0xF0010000. Da dieser Bereich im "Kernel Bereich" liegt hab ich da wohl keinen Zugriff darauf.
    Ich versuch jetzt mit MAPMEM und MAPTEST aus dem Microsoft SDK Zugriff auf die Karte zu bekommen. Problem: Als InterfaceType kann ich nur ISA, EISA, ... angeben aber nicht PCI!? Hat jemand Erfahrung mit dem MAPMEM Treiber. Welche Adresse und Busnummer muß ich wo angeben?


Anmelden zum Antworten