La commutation en mode Utilisateur à l'aide de iret

Je suis en train d'écrire un petit OS qui va exécuter du code en mode utilisateur (niveau de privilège 3). À partir de cet utilisateur au niveau du code, je veux appeler une interruption de retour à l'OS qui imprime un message. Je n'ai pas vraiment comment mon gestionnaire d'interruption des arguments ou quelque chose comme ça, vraiment, je veux juste un gestionnaire d'interruption pour m'informer (l'utilisateur) que le code est exécuté.

Ma question est: comment puis-je exécuter du code en mode utilisateur? J'ai une fonction qui met en place un Descripteur Local de Table avec un segment de code et le segment de données (à la fois avec le mode utilisateur des privilèges). Ce que je ne comprends pas c'est comment je suis censé pour charger ces segments dans cs, ss, et ds. J'ai réussi à charger le mon LDT, mais je ne sais pas comment l'utiliser effectivement. J'ai entendu dire que je devrais utiliser iret, mais je ne comprends pas exactement comment.

Une autre question que j'ai, c'est comment mon gestionnaire d'interruption doit travailler. Disons que j'ai installer un gestionnaire d'interruption pour numéro de vecteur 0x40, je veux print "bonjour, utilisateur de la mode!". Je sais comment faire pour configurer un gestionnaire d'interruption, mais je n'ai pas de comprendre exactement comment le contexte sera activé lors de la saisie d'un noyau gestionnaire d'interruption du mode utilisateur. Je sais que le cs registre doit changer, depuis ma routine sera exécuté à partir du segment de code spécifié dans mon IDT entrée. Je comprends aussi que la pile sélecteur probablement des changements, mais je ne suis pas certain de ce.

Quelqu'un pourrait-il m'expliquer ce contexte, des modifications sont apportées lorsqu'une interruption porte est appelé?

OriginalL'auteur Alex Nichol | 2011-07-31