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