(Courriels de diversion: <logos@brocard-rejoueront.com> <fiscales@congeles-limogent.com> <pretexte@jugulerions-decolores.com> <reluira@muselerent-empireront.com> <nucleaires@calculettes-susnomme.com> <skiait@resultant-insinuants.com> <repartiras@pacifions-vexons.com> <gercee@deboucheront-contresignerons.com> <exprimables@etranglements-vengerez.com> <glaiseux@affrontait-grefferions.com> )


Olivier Poitou wrote:
>  
>  On vient de me poser une question "il parait que ..."
>  "Si on passe une reference memoire a une fonction noyau
>  de Linux celui-ci est incapable de savoir si la zone
>  memoire appartient a un processus ou si celle-ci lui
>  appartient (au noyau)..."
>  

C'est tout a fait exact, linux ( comme tout systeme multi-taches )
utilise un systeme d'adressage
virtuel. Je m'explique :
( on considerera par commodite que le kernel est un processus. )

lorsqu'un processus se lance, il lui est automatiquement alloue un
espace 'virtuel'.
Pour ce processus, il est tout seul dans la memoire .... et il ne voit
personne !

Lorsqu'un processus alloue de la memoire, on lui renvoie un pointeur
'virtuel' qui est
l'adresse du buffer, mais dans son espace d'adressage memoire a lui.(ce
n'est pas une adresse
physique dans la RAM !! ).

Lorsque tu ecris dans ce buffer, tu ecris a une adresse virtuelle qui
est interprete par un circuit
electronique qui est le MMU ( Memory Management Unit ) en adresse
physique pour l'operation.

C'est ce qui explique que tu peux avoir 2 processus qui ecrivent a
l'adresse 0x12345 et qui
pourtant n'ecrivent pas au meme endroit en memoire !

Pour le kernel , c'est pareil ! Cela explique que quand tu passes un
pointeur 'virtuel' 
au kernel, celui-ci n'a aucun sens, car l'adresse n'a de sens que pour
ton processus !

Les seuls references communes a tous les processus sont les adresses
physiques.
Il convient donc pour realiser ton operation de faire :
- (allocation du buffer) -> pointeur virtuel
- transformer cette adresse virtuelle en adresse physique ( unsigned
long virt_to_phys(void *) )
- passer en parametre au kernel le pointeur physique.
( le kernel fera alors l'operation inverse 'phys_to_virt' pour savoir ou
ecrire. )

Voila ... ( heuuu j'espere avoir ete clair ... )

NB: l'operation de decodage de l'adresse virtuelle en physique est
realise par un circuit electronique, c'est ce qui explique que quand tu
ecris 'a cote' de tes buffers, tu generes
un 'Segmentation fault' qui est une interruption d'erreur d'adresse
invalide sur le processeur,
car le MMU ne t'autorise que tes zones de memoire a toi ! Tu ne peux
donc pas ecraser le buffer
de ton voisin ;)

Chris.

--
Kumsta Christophe
<kumsta@easynet.fr>Real-Time System developper
RT-Linux/RTAI ( Use the Source Luck !)

---------------------------------------------------------------------
Aide sur la liste: <URL:mailto:linux-31-help@savage.iut-blagnac.fr>Le CULTe sur le web: <URL:http://savage.iut-blagnac.fr/>