Re: fork e memoria
"Andrea Proli" <aprol-nc/[email protected]> Fri, 3 Dec 2004 21:01:58 +0100
| Newsgroups | gmane.comp.security.italian.devel |
|---|---|
| Message-ID | <004501c4d972$f23ba1f0$0201a8c0@lycantro> |
Ciao, credo di conoscere la soluzione al tuo problema, spero di non sbagliarmi. Un processo figlio non puo' condividere lo stesso spazio di indirizzament= o del processo padre, ad ogni processo vengono assegnati spazi di=20 indirizzamento indipendenti: ovvero, l'indirizzo logico 0x80498f0 del processo figlio e'= =20 mappato dal gestore della memoria virtuale in un indirizzo fisico diverso da quello i= n=20 cui viene mappato l'indirizzo logico 0x80498f0 del processo padre... In altre parole i due puntatori (o meglio, lo stesso puntatore x nei due=20 processi) puntato a zone di memoria *fisiche* differenti, per questo le modifiche=20 nell'area di memoria del processo figlio non si ripercuotono sull'area di memoria del processo= =20 padre. Quando la fork() crea il processo figlio *copia* anche le variabili nella= =20 memoria del padre in quella del figlio, per cui ti sembra di vedere *lo stesso*=20 spazio di memoria ma lo spazio di memoria =E8 solo *uguale* (o quasi!), non =E8 *lo stesso*= . Comunque se vuoi approfondire il discorso puoi fare riferimento a qualsia= si=20 libro di testo sui sistemi operativi, ad es. il libro di Tanenbaum e Woodhull "Sistemi=20 Operativi", edito da UTET. Spero di esserti stato utile, Andrea Proli ----- Original Message -----=20 From: "Stefano Di Paola" <[email protected]> To: <[email protected]> Sent: Monday, November 29, 2004 1:34 PM Subject: [devel] fork e memoria > Ciao a tutti, > > sto facendo un po' di ricerca sugli aspetti di sicurezza della fork. > Non capisco una cosa. Come mai quando debuggo un processo figlio > vedo lo stesso spazio di memoria del padre ma una modifica da parte del > processo figlio non e' rilevato dal processo padre? > Ad es.: > //forkit.c > void main(int argc, char **argv) > { > pid_t id; > int *x , x1; > x=3D(int *)malloc(sizeof(int)); > *x=3D3; > x1=3D2; > printf("Parent: before fork x =3D %d &x=3D%x x1=3D%d &x1=3D%x\n", > *x,x,x1,&x1); > id =3D fork(); > if (id =3D=3D 0) { > printf("Child: id =3D %d\n", id); > printf("Child: x =3D %d &x=3D%x x1=3D%d &x1=3D%x\n", *x,x,x1,&x1); > *x=3D99; > x1=3Dx x1=3D%d &x1=3D%x\n", *x,x,x1,&x1); > exit(0); 99; > printf("Child: x =3D %d &x=3D% > } else { > /* we are in the parent */ > printf("Parent: id =3D %d\n", id); > printf("Parent: wait for child\n"); > id =3D wait(NULL); > printf("Parent: child terminated pid =3D %d\n", id); > printf("Parent: x =3D %d &x=3D%x x1=3D%d &x1=3D%x\n", *x,x, x1,&x1); > } > } > $ ./forkit > Parent: before fork x =3D 3 &x=3D80498f0 x1=3D2 &x1=3Dbffff6fc > Parent: id =3D 6823 > Parent: wait for child > Child: id =3D 0 > Child: x =3D 3 &x=3D80498f0 x1=3D2 &x1=3Dbffff6fc > Child: x =3D 99 &x=3D80498f0 x1=3D99 &x1=3Dbffff6fc > Parent: child terminated pid =3D 6823 > Parent: x =3D 3 &x=3D80498f0 x1=3D2 &x1=3Dbffff6fc > > Saluti e grazie in anticipo! > Stefano > > -------------------------------- > Stefano Di Paola > Ingegnere Informatico > Email: stefano.dipaola_at_wisec.it > Web: http://www.wisec.it > > -------------------------------- > > -------------------------------------------------------------------------= ------- ________________________________________________________ http://www.sikurezza.org - Italian Security Mailing List=20 ________________________________________________________ http://www.sikurezza.org - Italian Security Mailing List