2016-01-28 1 views
0

J'ai une question conceptuelle concernant les systèmes d'exploitation et les gestionnaires de défauts de page. Considérons le cas où le noyau a un espace d'adressage virtuel. Donc s'il y a un défaut de page et que l'exécution saute au gestionnaire d'erreur de page. Et si la pile pour l'exécution du gestionnaire d'erreurs de page provoque une erreur de page, que se passe-t-il alors?Gestionnaire d'erreurs de page récursives

+1

Je ne peux pas répondre à votre question tout à fait, mais le noyau lui-même a plein règne sur la mémoire, et peut faire en sorte que vital les routines comme celle-ci ne sont pas paginées sur le disque. En fait, vous pouvez verrouiller des pages dans une application d'espace utilisateur en utilisant [mlock] (http://man7.org/linux/man-pages/man2/mlock.2.html). – Yuushi

+0

Wow, je n'avais aucune idée mlock existé! Merci de me l'avoir dit !! Il y a donc une pile réservée pour chaque gestionnaire dans la table de vecteurs d'interruption? – Curious

+1

@Curious: Il n'y a pas de pile réservée pour les gestionnaires. Ils sont toujours dans la mémoire physique et ne sont jamais démontés. Ils sont dans l'espace noyau, pas dans l'espace utilisateur. – ray

Répondre

3

si la pile pour l'exécution du gestionnaire d'erreurs de page provoque une erreur de page, que se passe-t-il alors?

Il n'y a pas de pile réservée pour les gestionnaires.

La routine de gestion des erreurs de page fait partie du noyau du système d'exploitation, et donc de l'espace noyau. Même si la mémoire du noyau est toujours organisée en pages, ces pages restent résidentes dans la mémoire physique et ne sont pas échangées sur le disque. Les choses qui sont échangées sur le disque sont dans l'espace utilisateur. En tant que tel, puisque la mémoire du noyau n'est pas permise, les défauts de page ne seraient pas générés pendant que le noyau essayait de gérer une erreur de page.

Cela a du sens si vous y réfléchissez. Le noyau serait incapable de gérer les fautes de page si le code pour gérer les fautes de page exigeait un gestionnaire d'erreur de page pour se remettre dans la mémoire physique. Ce serait incapable de le faire.

En principe, si nous essayons toujours d'assumer votre scénario, alors je pense que le noyau serait:

  • besoin de devenir plus compliqué pour traiter ce cas vous avez soulevé;
  • ne pas pouvoir utiliser ou prendre en charge les espaces d'adressage virtuels et/ou la mémoire d'échange;
  • plantait dès la première page faute a lieu (par exemple, probablement une panique du noyau)
+0

Désolé j'ai posté un commentaire ci-dessus, mal juste le copier ici aussi - Mais que se passe-t-il si la pile d'exécution pour la routine se développe à un point de mémoire qui est mappé à une adresse virtuelle pour un autre processus? – Curious

+1

@Curious: Je ne suis pas sûr que je suis votre question. Je pense que vous pourriez mélanger quelques choses. Les adresses virtuelles sont mappées à des adresses physiques, et non l'inverse. En fin de compte, si un gros désordre qui ne peut pas être géré devait avoir lieu à l'intérieur du noyau, alors vous aurez probablement un comportement imprévisible, une impasse ou, dans le pire des cas, une panique. Ce [wiki osdev] (http://wiki.osdev.org/Paging) pourrait vous être utile. – ray

+0

Désolé de ne pas être clair! C'est ce que je voulais dire - Supposons que le processus A accède à la mémoire à l'emplacement mémoire 4000 et qu'il y ait une erreur de page, l'exécution passe au gestionnaire d'erreurs de page (supposons dans ce schéma que nous avons un noyau virtuel) Le gestionnaire d'erreurs de page est en cours d'exécution, et il incrémente le pointeur de la pile et stocke quelque chose sur la pile à l'adresse 4020, il y a un autre défaut de page. Qu'est-ce qui se passe alors? – Curious