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
Vous devez vous connecter pour publier un commentaire.
Arriver à l'anneau 3 peut être fait en utilisant
iret
parce que la façon dont il fonctionne a été documentée. Lorsque vous recevez une interruption, le processeur pousse:iret
œuvres par défaire les étapes 1 à 3 (Le rapport de recherche internationale est responsable de l'annulation de l'étape 4 si nécessaire). Nous pouvons utiliser ce fait pour obtenir de l'anneau 3 en poussant les informations nécessaires à la pile et de l'émission d'uniret
instruction. Assurez-vous d'avoir le bon CPL dans votre code et segments de pile (le bas deux bits doit être définie dans chaque). Cependant,iret
ne pas modifier les segments de données, de sorte que vous aurez besoin de les modifier manuellement. Vous utilisez lemov
instruction pour ce faire, mais vous ne serez pas en mesure de lire les données à l'extérieur de la pile entre le faire et de commutation des anneaux.Si vous voulez un travail terminé, exemple, voir ce tutoriel.
Lorsqu'une interruption est émis, le processeur lit de votre IDT pour obtenir le bon segment de code et le pointeur d'instruction pour le rapport de recherche internationale. Il cherche alors à votre TSS pour trouver le nouveau segment de pile et le pointeur. Il change
ss
etesp
de manière appropriée, puis pousse les anciennes valeurs de la nouvelle pile. Il ne pas modifier les données de registres de segment. Vous devez le faire manuellement si vous avez besoin d'accéder à la mémoire dans votre rapport de recherche internationale.Je me suis connecté juste pour upvote ce! Merci! Aussi pour quelqu'un d'autre là-bas, je recommande osdev, et l'Intel ISA manuels. Ils ont vraiment de clarifier les choses.
Que voulez-vous dire IRET ne change pas le segment de données? Parlez-vous des valeurs à l'intérieur de registres?
Non, je veux dire le segment de données, les registres, les
ds
,es
, etc. Ils ne sont pas modifiées, de sorte que tout ce qui sont utilisés doivent être configurés manuellement.OriginalL'auteur ughoavgfhw
Vous pouvez également faire une retf. Une mesure de revenir à une moins privilégiés segment de code de la nouvelle ss et sp être sauté des privilégiés de la pile.
Assurez-vous juste que vous faire des retours pour la mesure des appels et irets pour les interruptions. La seule différence entre eux est la présence de drapeaux sur la pile, mais il est sage de ne pas ot mélanger.
Aussi, n'oubliez pas que les exceptions parfois pousser les codes d'erreur sur la pile.
OriginalL'auteur Raymond Jennings