[SOS] changement de privileges
stephane duverger
stephane.duverger at free.fr
Sam 5 Mar 15:30:10 CET 2005
Bonjour,
J'ai lu votre article concernant la gestion du userland. Malheureusement
je n'ai pas pu acceder au code et je suis tracassé car une question me
mine.
Comment faites-vous pour lancer le premier programme utilisateur en ce
qui concerne la gestion des privileges ?
Comment passer du kernel land au user land sachant que la doc intel dit
(section 4.8.1.1):
"The cpl of the calling procedure must be equal to the dpl of the
destination code segment" dans le cas de segment non-conformes.
Et c'est pire encore avec des segments conformes car le cpl de
l'appelant doit etre >= (moins privilegié) au dpl destination.
Si dans notre cas l'appelant est le noyau et la destination un contexte
utilisateur, argggg.
Une premiere solution consistait a utiliser des TSS et faire un far jmp
dans un descripteur de TSS car le processeur ne verifie rien durant
cette etape.
Or le probleme avec les TSS c'est que la syntaxe at&t de la commande
"ljmp" ne prend que des valeurs immediates, donc difficile a gerer
dynamiquement sans modifier le code a la volee. Apparement elle peut
prendre une operande memoire mais je n'ai pas reussi a le faire
correctement ... polyo surement.
Alors je me suis dit que le mecanisme des interruptions passait outre
cette gestion de privilege bien corriace.
La seconde idee pourrait etre de placer dans la pile noyau du process
user les flags, le selecteur de segment (cs avec cpl==3) et l'eip, lors
de sa creation (dans le cas d'une interruption d'horloge qui
entrainerait un changement de contexte on aurait naturellement ces infos
dans la pile kernel du process user). Et de faire l'iret apres le
changement de contexte en faisant pointer sp au bon endroit.
J'ai bon :) ? Vous ne le mentionnez pas et je n'ai pas pu voir votre
code, j'aimerais savoir comment vous avez fait, ca m'illuminerait :)
L'utilisation d'une interruption pour les appels systemes se justifie
donc car pas de verification des privileges et donc on peut executer du
code en mode kernel facilement et revenir en user ensuite car ce qui a
ete empilé au moment de l'interruption correspondait à des informations
utilisateurs (flags, selecteur de segment et eip).
En fait le probleme est apparu lorsque je me suis mis à lire
"Understanding the linux Kernel" et que j'ai vu qu'un thread noyau
"init" chargeait "le programme init" du disque et le lancait en
userland. Comment font-ils ca, ce n'est pas expliqué ou alors parrait
naturel. En fait ma demarche a été la suivante:
- imaginons qu'une boucle infinie (idle) ne fasse rien dans le noyau.
- l'interruption d'horloge finit par arriver.
- l'ordonnanceur trouve dans sa liste un process user.
- nous sommes en mode noyau et aucun processus (ou thread) n'a encore
été lancé.
- comment basculer vers le monde utilisateur ? On peut pas appeler le
point d'entrée du programme simplement car nous aurions #GP en regard de
ce qu'explique la doc intel.
J'espere que vous comprenez mon souci, enfin que j'arrive à etre clair
en vous l'expliquant.
D'autre part j'avais mis un mail le mois dernier en ce qui concernait
les rencontres. Est-ce tombé à l'eau ? Ca ferait plaisir de vous voir et
de pouvoir discuter avec vous et les personnes interessées par le
développement de noyaux.
Merci d'avance pour votre explication.
stephane
Plus d'informations sur la liste de diffusion Sos