Newsgroup: it.comp.programmare
Titolo: domanda a carattere teorico :-P

Salve a tutto il NG, ultimamente mi sono sorti dei dubbi a carattere
teorico per quanto riguarda i moduli copy-on-write (sto parlando di
Windows, ma ho postato qui anziché su it.comp.programmare.win32 perché
probabilmente riguarda anche altri sistemi operativi).
Innanzitutto volevo sapere se le DLL in Windows NT/2k/Xp sono
copy-on-write o se esiste una copia distinta per ciascun processo (salvo
naturalmente per le DLL che hanno delle sezioni di codice "shared").
Inoltre vorrei sapere alcuni dettagli circa la gestione di un modulo
copy-on-write: supponiamo che ne sia stato caricato uno in un certo numero
di processi, e che inizialmente ci sia la stessa copia in tutto il
sistema; a questo punto (tenete presente che sto ragionando in termini
Win32 :PPP) uno dei processi vuole modificare il codice di questo modulo:
innanzitutto si assicura con VirtualProtect che l'area di memoria sia
scrivibile (spero di non aver sparato troppe cantonate finora ^_^'),
dopodiché si distinguono due casi:
1) il processo modifica il codice scrivendolo con WriteProcessMemory: il
sistema operativo si accorge del tentativo di modifica e prima di
effettuare la scrittura crea una nuova copia del segmento da modificare
dedicata a quel processo;
2) il processo modifica direttamente il codice senza passare per nessuna
API, quindi ad esempio ottiene il puntatore ad una funzione (con
GetProcAddress) e scrive direttamente a quell'indirizzo.
Allora i miei dubbi sono:
1) nel 1° caso il SO fa una copia del modulo, OK, ma questo vuol dire che
gli indirizzi delle funzioni cambieranno tutti, e se x caso la mia
applicazione deve chiamare una funzione di quel modulo (conoscendo il
vecchio indirizzo) che succede??? se chiama la funzione nella vecchia
copia del modulo, allora vuol dire che le modifiche non sono servite a
nulla...?!?
2) nel 2° caso il sistema operativo, è in grado di intercettare la
scrittura??? è in grado di creare in tempo una copia separata dedicata al
processo che sta tentando di modificare il codice? se la risposta è no,
questo vuol dire che la modifica ha effetto su tutto il sistema?
Aggiungo che ho cercato su Usenet del materiale in proposito, e ho
parzialmente trovato risposta alle mie domande, ma non sono del tutto
sicuro.
Ringrazio chiunque per l'eventuale interessamento al thread,
saluti e buone feste :)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

possibile che nessuno sappia nulla di tutto ciň? :-(


forse č perché sono OT; se č cosě, sapete indicarmi qualche NG dove si
parli di aspetti di programmazione di sistemi operativi ad un livello piů
o meno basso?


a questo punto inizia a sembrarmi evidente di essere stato plonkato: mi
piacerebbe tanto conoscere il perché...


 
Da me almeno non sei stato plonkato... sfortunatamente non so aiutarti 
:)
-- 
       ___/\/o\/\/here/\/\an___
["Vagisil migliora la tua vita intima"]
 
www.vagisil.com/teencenter.shtml

 :)
DOH! O_o'
ma allora č proprio ignoranza di massa! speravo non fosse questa la
ragione... O_o'
č l'ennesima volta che chiedo qualcosa e non ricevo risposta alcuna; io da
parte mia ogni tanto aiuto gli altri, ma non ricevo feedback!
io mi chiedo a cosa possano mai servire sti newgroups italiani di
programmazione se alla gente piace parlare della differenza tra bool e
int...
possibile che non interessino a nessuno gli internals di un sistema
operativo? siete programmatori o cosa? d'accordo le esigenze di lavoro, i
tempi stringenti, ecc., ma se siete programmatori si suppone che abbiate
un minimo spunto di interesse per il settore...
mi dovete proprio far arrivare a concludere che i programmatori italiani
hanno una preparazione superficiale?!?
scusate se ho offeso qualcuno, ma l'intenzione di questo post era piů che
altro un incoraggiamento ad approfondire la vostra cultura informatica.
saluti.


 informatica. 
Be'... forse qui semplicemente non c'č gente che ha studiato gli 
aspetti di programmazione a cui fai riferimento tu, e quindi nessuno 
ti ha risposto... insomma, non siamo mica a scuola: "qualcuno sa 
questo?" "io no" "io no" "io no"
Voglio dire, chissenefrega di dire di no, se non lo so, sto zitto, ti 
pare?


 pare?
a parte il fatto che chiunque abbia anche solo una cultura accademica
minimale avrà sicuramente studiato qualcosa in proposito (come farò io
l'anno prossimo al corso di Sistemi Operativi), ma cmq questa non è la
prima volta che si ripete una scena del genere (nel senso che non è la
prima volta che chiedo qualcosa e "nessuno ne sa nulla"). ovvio che se uno
non sa una cosa non va a dire "io non lo so" su Usenet, altrimenti si
sviluppa un flood mostruoso e inutile, ma il fatto su cui voglio porre
l'accento non è che nessuno mi risponde, chisseneimporta se uno mi
risponde e mi dice "non lo so", è proprio che nessuno sa queste cose!
nessuno sa in cosa consiste la gestione copy-on-write di un
modulo/libreria da parte di un sistema operativo? no, apparentemente
nessuno; è possibile affermare che una buona media di programmatori
italiani non lo sa. certo, detto così sembra un po' come dire "c'è
qualcuno che sappia come risolvere questo intricatissimo problema di
analisi matematica in cui bisogna calcolare la derivata decima di una
funzione definita a sistema in 7 intervalli diversi, poi integrare la
stessa funzione e applicare la formula risultante al calcolo della
velocità istantanea di un corpo che si muove di moto imbizzarrito e che
bla bla bla??? no, non c'è nessuno che lo sa fare!" perfettamente normale
e comprensibile che nessuno lo sappia fare, ma vi ricordo che voi siete
programmatori (in altre parole, sarebbe come dire: c'è qualche MATEMATICO
che sappia fare quella roba là? io mi aspetterei di si francamente...), e
di conseguenza questi argomenti, che non siete tuttavia obbligati a
conoscere, dovrebbero quantomeno suscitare in voi un minimo di interesse,
no?


 sviluppa un flood mostruoso e inutile, 
[...]
Ok. Allora sei stato plonkato :P


 Ok. Allora sei stato plonkato :P
ah, ecco, appunto. e perché, vorrei sapere? vi prometto che se me lo dite
cercherò di correggermi! :-)


 sicuro.
Prova a leggere questo:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/base/memory_protection.asp
-- 
     Carlo Milanesi
 
http://digilander.libero.it/carlmila


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/base/memory_protection.asp
assolutamente perfetto, e anche le altre pagine che stavano nella stessa
radice dell'indice erano molto interessanti; ti ringrazio :-)
ho riscoperto MSDN... :-)
non immaginavo la presenza di informazioni di quel genere, pensavo che
fosse essenzialmente un reference nudo e crudo, senza tante spiegazioni
teoriche, ma mi sbagliavo, ho trovato delle cose molto interessanti! :-)
ciao


 no?
No. Li ho studiati a suo tempo e ora non mi interessano.
Se hai un qualche dubbio di essere stato plonkato da parte mia no. Ma se
insisti lo posso anche fare :-)
Ciao, Enrico

 insisti lo posso anche fare :-)
suvvia, sappiamo tutti quanti qui su usenet che il plonk è una misura
completamente inutile, primo perché vorrei proprio conoscerla la persona
che effettivamente smette di leggere definitivamente i post di una persona
plonkata, secondo perché vorrei proprio conoscerla la persona che dopo
essere stata plonkata non torna con un altro nick.
vorresti forse farmi credere che non sapessi fin dall'inizio che io sapevo
perfettamente di non essere mai stato plonkato da nessuno?


 questo non mi torna... o__o
Vedi: 
http://en.wikipedia.org/wiki/Copy-on-write
Comunque non mi risulta comune (= e' molto raro) ne' consigliabile, 
scrivere in un segmento di codice.



uff...nessuno ti ha plonkato. La domanda che hai posto č specifica di
Windows, devi chiedere lě, qui troverai poche persone capaci di
risponderti.
ciao

 scrivere in un segmento di codice.
è raro e sconsigliabile se chi lo fa non ha una *FERREA* conoscenza
dell'assembly della macchina su cui compila, ma non necessariamente
inutile! è il sistema migliore per l'intercettazione di chiamate a
funzioni di cui conosci l'indirizzo (spesso funzioni API)


 sicurezza elevati...
guarda, se ti va puoi dare un'occhiata al paper che descrive il 
funzionamento della memoria virtuale di freebsd (c'è anche tradotto in 
italiano) che spiega un po' queste cose.
In particolare, parla dei fork() che in unix sono il pane quotidiano, e 
di come gestisca appunto la memoria tramite meccanismi COW. Immagino che 
i concetti siano gli stessi..
In sostanza, mi pare che il concetto che ti è mancato è che gli 
indirizzi sono tutti virtuali, ed è il SO che si preoccupa di far 
arrivare il processo sempre allo stesso indirizzo virtuale anche se 
cambia quello fisico. D'altronde è lo stesso meccanismo dello swap, se 
un'area di memoria viene messa su disco e poi ricaricata in memoria *non 
torna (beh, non deve tornare) allo stesso posto di prima*, ma per il 
processo ciò è invisibile.
PS
io ho skippato il tuo messaggio iniziale perché come altri, non ho idea 
di cosa sia WriteProcessMemory, ne' VirtualProtect, ne' GetProcAddress e 
quindi ho accannato la lettura li :)

 quindi ho accannato la lettura li :)
aaahhh perfetto, grazie per la tua risposta! :-)
hai ragione, in effetti era meglio se postavo su it.comp.programmare.win32
oppure se parlavo in termini più generici. WriteProcessMemory,
VirtualProtect e GetProcAddress fanno parte del set Win32 di funzioni API
messe a disposizione dal sistema operativo (Windows naturalmente) tramite
alcune librerie di sistema, in questo caso kernel32.dll.
per quanto riguarda il subject del thread hai perfettamente ragione:
quello che non sapevo e che ho imparato in questa occasione era di come il
SO rimappa gli indirizzi virtuali su quelli fisici (giustissimo l'esempio
delle zone di memoria provenienti dal file di scambio).
Quindi le mie supposizioni erano esatte: anche altri SO usano sistemi
analoghi, quindi tutto sommato questo thread non era del tutto fuor di
luogo in un NG di programmazione *non* specifica per Windows.
d'altro canto si sa, la Microsoft raramente ha *inventato* qualcosa :-)
potevo ben immaginare che si trattasse di tecnologie usate in maniera
analoga in altri contesti.
ciao.
