[SOS] Chapitre 6 - Userland
David Decotigny
david.decotigny at free.fr
Lun 26 Sep 20:30:18 CEST 2005
Bonsoir,
KAISER Edouard wrote:
> J'en arrive également à vouloir charger des programmes en memoire dans
> l'espace utilisateur en me basant sur votre methode de chargement
> (fort ingénieuse au passage !). Le problème c'est que la zone noyau
> s'arrete précisement aux 8 premiers mega octets physiques (choix
> arbitraire, histoire de mettre une limite...) et l'espace utilisateur
> commence immédiatement aprés ces huits octets.
> De ce fait si le code noyau essaye de copier quelque chose au dela de
> ces 8Mo, je souleve forcement une exception car je dépasse la limite
> indiqué dans le descripteur...
En effet.
> De ce fait je me demande si le descripteur de segment du noyau ne
> devrait pas couvrir toute la zone adressable meme dans un modele multi
> segment ?
Pas necessairement.
> segment ? Si ce n'est pas le cas je ne vois pas comment le noyau
> pourra copier quoi que ce soit en dehors de son espace.
Il suffit de changer (temporairement) de descripteur de segment pour
utiliser celui du processus utilisateur. En C pur, la difficulte est de
faire la gymnastique avec gcc. En effet, gcc accede a toutes les donnees
via le registres ds (et ss), mais si tu changes ce registre pour pointer
sur le dscripteur du processus user tu risques d'avoir des surprises
(gcc ne va plus retrouver ses petits : variables locales et parametres
de fonction entre autres). A mon avis le plus simple est de passer par
une routine style memcpy() au petits oignons en assembleur, qui specifie
explicitement les registres de segments dans toutes les phases de
recopie. Par exemple, on ne touchera pas au registre ds pour pouvoir
acceder aux donnees (locales) noyau et on fera les recopies en utilisant
explicitement le registre "es" positionne a la valeur du descripteur des
donnees user du processus.
Bon courage,
--
http://david.decotigny.free.fr/
Plus d'informations sur la liste de diffusion Sos