(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/>