2013-09-27 3 views
16

Dans ma classe de systèmes d'exploitation, on me demande si le passage de l'utilisateur au mode kernel est privilégié. Ce n'est pas spécifique au système d'exploitation. Au début, je pensais que oui, mais il semble comme un grand Catch 22. J'ai parlé de mon livre:Passage du mode utilisateur au mode noyau

Le matériel permet des instructions privilégiées à exécuter que dans mode noyau. ...

L'instruction de passer en mode noyau est un exemple d'instruction privilégiée .

Gagne, Greg; Abraham Silberschatz; Peter B. Galvin (2010-01-26). Concepts du système d'exploitation (p. Wiley Supérieur Ed. Édition Kindle.

Nous commençons donc en mode utilisateur. Passer en mode noyau nécessite une instruction privilégiée. Une instruction privilégiée doit être faite en mode kernel, donc nous devons passer en mode noyau pour activer le mode kernel.

Je pense que le système ne permet pas à un utilisateur de passer directement en mode noyau, mais que c'est fait par le noyau lorsque l'utilisateur cherche à exécuter une autre instruction privilégiée. Est-ce exact?

+0

Alors, est-ce vraiment une faute de frappe? – denis631

Répondre

6

C'est une faute de frappe introduite dans la 8ème édition et conservée dans le 9ème. Dans la septième édition, la page 19, il est dit à la place:

« L'instruction pour passer en mode utilisateur est un exemple d'une instruction privilégiée. »

Ce qui est nettement plus logique.

+1

Je ne suis pas si sûr. Le [errata] (http://codex.cs.yale.edu/avi/os-book/OS7/os7c/online-dir/os7-errata.pdf) pour la 7ème édition indique clairement que le 8ème (et donc 9ème) édition sont corrects ... (Ce qui veut dire qu'il a été identifié comme une erreur dans la 7ème édition.) – Ephemera

+0

@ephemera personnes qui maintiennent l'errata sont probablement des étudiants. – atulgangwar

+1

comment est-il plus logique que le passage au mode noyau ne nécessite pas de privilège ?? (chaque programme peut-il simplement le faire?) – Rptk99

0

Dans la zone utilisateur, vous demandez des opérations privilégiées via les appels système au noyau, qui effectue le basculement vers le mode noyau si nécessaire. L'utilisateur utilise une API, le noyau effectue les opérations privilégiées.

3

Il existe généralement un ensemble d'instructions qui ne doivent pas vraiment passer en mode noyau de façon générale, mais demander des services système. Ils passent donc en mode noyau, mais uniquement dans le contexte de l'appel d'une partie de la fonctionnalité qui a été configurée par le système d'exploitation dans le but d'être appelé par le code utilisateur.

Dans la plupart des systèmes modernes, même cela est masqué par une couche API qui implémente une fonction spécifique dont une partie peut effectuer un appel de système d'exploitation comme ci-dessus.

Mais en général il est vrai que le code utilisateur ne peut pas faire l'équivalent de dire "à partir de maintenant, je veux être en mode noyau".

+0

Donc, cela signifie qu'il existe des instructions, qui passent en mode noyau afin d'appeler d'autres services du système, mais la question n'a toujours pas de réponse, IMO. Si le passage au mode noyau est une instruction privilégiée, alors personne ne peut le faire depuis le mode utilisateur, n'est-ce pas? Totalement confus ... – denis631

30

En mode utilisateur, vous ne pouvez pas simplement passer en mode noyau. L'interaction entre l'utilisateur et le noyau se fait via des appels système. Chaque appel système fournit un service défini. L'utilisateur envoie le nom du service (généralement un numéro) et les paramètres requis. Voici un exemple concret de la façon dont cela est fait. C'est x86 AT & assembleur de style T.

Il déplace le nom de l'appel système dans le registre EAX, le pointeur vers les paramètres dans le registre EBX de la CPU, puis émet le numéro d'interruption du logiciel 42. La gestion des interruptions passera au mode noyau. Le numéro d'interruption est recherché dans la table des descripteurs d'interruption (IDT) et appelle la fonction qui y est enregistrée, le gestionnaire syscall. Ce gestionnaire s'exécute en mode noyau. En revenant au mode utilisateur, le code déplacera le contenu d'EAX dans la variable ret.

pok_ret_t pok_do_syscall (pok_syscall_id_t syscall_id, pok_syscall_args_t* args) 
{ 
    pok_ret_t ret; 
    uint32_t args_addr; 
    uint32_t id; 

    args_addr = (uint32_t) args; 
    id  = (uint32_t) syscall_id; 

    asm volatile ("movl %1,%%eax \n\t" 
       "movl %2,%%ebx \n\t" 
       "int $42  \n\t" 
       "movl %%eax, %0 \n\t" 
       :"=g"(ret) 
       :"g"(id), "g"(args_addr) 
       : "%eax" , "%ebx" 
       ); 
    return ret; 
} 

Le OS Dev wiki est un bon point pour en savoir plus à ce sujet.

Donc, vous ne passez pas simplement au noyau, mais vous pouvez demander au noyau de faire quelque chose pour vous. Et puis le noyau vous dit si cela a été fait ou non.

+1

Ceci est la bonne réponse et m'a beaucoup aidé. Je vous remercie! –

+0

Ouais c'est une excellente réponse, mais qu'en est-il du Mode Bit ... Quand cela change-t-il ... –

+0

@BaradwajAryasomayajula Voulez-vous dire [CR0.pe] (http://wiki.osdev.org/CPU_Registers_x86#CR0) ? Pourquoi est-ce pertinent pour vous? Peut-être que c'est une question distincte. Je ne peux pas vous donner une réponse précise, mais l'instruction "int" exécutée par la CPU déclenche une interruption, qui initie le passage au mode noyau. Vous pourriez vouloir regarder le [manuel d'Intel] (https://www-ssl.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html) pour plus de détails. – Philipp

Questions connexes