71104
16-07-2005, 00:53
mettiamo che ho una DLL che contiene una sezione di dati SHARED; in qualsiasi processo venga caricata la DLL, gli indirizzi virtuali di quei dati saranno sempre gli stessi e punteranno sempre agli stessi indirizzi fisici.
la mia domanda è: come viene implementata dal sistema operativo questa caratteristica? allora, io carico la DLL nel processo 1: la sezione shared assume un certo base address; poi carico la DLL nel processo 2: nel processo 2 durante il caricamento dovrei mappare gli stessi indirizzi virtuali della sezione shared del processo 1 puntandoli agli stessi indirizzi fisici; ma che faccio se quel base address nel processo 2 è già occupato per altre cose?
ipotesi 1: il codice che lavora sui dati shared viene rilocato; ma c'è un problema: il processo A scrive nella sezione, se nel processo B la sezione è stata spostata i cambiamenti non avranno effetto in B.
ipotesi 2: le pagine della sezione sono segnate come copy-on-write e per ogni scrittura che il sistema operativo intercetta, viene aggiornata anche la copia negli altri processi; a occhio mi sembra poco performante... :mbe:
ipotesi 3: ad ogni nuovo caricamento della DLL (e ad ogni possibile nuovo spostamento della sezione) è possibile che tutte le istanze della DLL debbano essere rilocate; ok, ma c'è un altro problema: se prima della nuova rilocazione io ho memorizzato in una mia variabile un puntatore alla sezione, dopo la rilocazione non è più valido... :mbe:
chi mi illumina plz? ^^'
fek? :D
la mia domanda è: come viene implementata dal sistema operativo questa caratteristica? allora, io carico la DLL nel processo 1: la sezione shared assume un certo base address; poi carico la DLL nel processo 2: nel processo 2 durante il caricamento dovrei mappare gli stessi indirizzi virtuali della sezione shared del processo 1 puntandoli agli stessi indirizzi fisici; ma che faccio se quel base address nel processo 2 è già occupato per altre cose?
ipotesi 1: il codice che lavora sui dati shared viene rilocato; ma c'è un problema: il processo A scrive nella sezione, se nel processo B la sezione è stata spostata i cambiamenti non avranno effetto in B.
ipotesi 2: le pagine della sezione sono segnate come copy-on-write e per ogni scrittura che il sistema operativo intercetta, viene aggiornata anche la copia negli altri processi; a occhio mi sembra poco performante... :mbe:
ipotesi 3: ad ogni nuovo caricamento della DLL (e ad ogni possibile nuovo spostamento della sezione) è possibile che tutte le istanze della DLL debbano essere rilocate; ok, ma c'è un altro problema: se prima della nuova rilocazione io ho memorizzato in una mia variabile un puntatore alla sezione, dopo la rilocazione non è più valido... :mbe:
chi mi illumina plz? ^^'
fek? :D