Virtuelle Speicherverwaltung - Wo werden Sharded Libs und DLL Dateien abgelegt, wenn jeder Prozess



  • seinen eigenen linearen virtuellen Adressraum erhält und somit eigentlich gar nicht auf den Prozessraum anderer Prozesse zugreifen kann.

    Da Shared Librarys und DLL Dateien aber von mehreren Prozessen verwendet werden können, stellt sich hier nun für mich die Frage, wie das nun realisiert wird.



  • VM & DLLs schrieb:

    auf den Prozessraum anderer Prozesse zugreifen kann.

    Kleiner Tippfehler, ich meine natürlich Adressraum. 😉



  • VM & DLLs schrieb:

    Da Shared Librarys und DLL Dateien aber von mehreren Prozessen verwendet werden können, stellt sich hier nun für mich die Frage, wie das nun realisiert wird.

    Wenn ein PE Image wie z.B. eine DLL in einen Prozess geladen wird, dann wird erstmal das PE Image quasi als memory mapped File in den Adressraum dieses Prozesses eingeblendet.
    D.h. das OS merkt sich einfach das File X.DLL gehört im Prozess Y an Adresse Z eingeblendet.

    Das können auch mehrere Prozesse an unterschiedlichen Stellen machen. Das DLL File muss ja trotzdem nur 1x im RAM stehen, es kann ja in verschiedenen Prozessen an verschiedenen Stellen die selbe phyiskalische Speicherseite eingeblendet werden.

    Jetzt kommt natürlich noch die Sache mit den Relocations. Das OS muss bestimmte Stellen im PE Image umschreiben, damit sie zu der Adresse passen wo die DLL im jeweiligen Prozess geladen wird.
    Dazu wird Copy-On-Write verwendet. D.h. wenn ein Prozess eine Speicherseite der eingeblendeten DLL das erste mal ändert, dann wird eine private Kopie dieser Speicherseite für diesen Prozess angelegt.
    D.h. zwischen Prozessen geshared werden nur Speicherseiten die kein Prozess modifizieren musste.

    Damit das nicht dazu führt dass fast die ganze DLL erst wieder für jeden Prozess kopiert werden muss, kann jede DLL eine "preferred load address" angeben. Die ganzen Adressen sind im DLL File dann so abgespeichert dass sie zur "preferred load address" passen. Dadurch muss nix umgeschrieben werden wenn die DLL an dieser Adresse in einen Prozess eingeblendet wird, und daher müssen dann auch keine Seiten kopiert werden.

    Und bei x64 ist das ganze dann - soweit ich weiss - quasi kein Thema mehr, da hier position-independent Code verwendet wird. D.h. es muss sowieso nichts oder fast nichts an die load-address angepasst werden.



  • Verstehe, aber wenn nun die Adresse der DLL in den Adressbereich eines Prozesses eingeblendet wird, wie wird dann verhindert, dass dieser Prozess die Daten der DLL, auf die die Adresse der DLL verweist, verändert werden?

    Ich meine, es wäre ja doof für die anderen Prozesse, wenn diese plötzlich eine veränderte DLL vorfinden würden.



  • VM & DLLs schrieb:

    Verstehe, aber wenn nun die Adresse der DLL in den Adressbereich eines Prozesses eingeblendet wird, wie wird dann verhindert, dass dieser Prozess die Daten der DLL, auf die die Adresse der DLL verweist, verändert werden?

    WTF? Es wird nicht die Adresse eingeblendet sondern die DLL selbst.
    Und wie es verhindert wird hab ich ja schon geschrieben: Copy-On-Write.


Anmelden zum Antworten