Principe de fonctionnement d'une MMU (pagefault)

Jan 17, 2026 Last reply: 6 months ago 2 Replies

Bonjour à tous,



J'essaie péniblement de concevoir une MMU pour un coeur de CPU en VHDL et j'avoue avoir un problème de logique.



La MMU prend 32 bits en entrée et génère une adresse de 36 bits. Elle contient quatre niveaux d'exécution (ring 0 à 3) et les pages font 4 Ko.



Toutes les interruptions sont traitées dans le ring 0. Lorsqu'un défaut de page est détecté, le CPU réinitialise son état interne (comme il l'était lors du début d'exécution de l'instruction ayant levé le défaut de page) puis empile ses registres sur la pile système (dans le ring source). Il cherche le vecteur d'interruption correspondant (ici TRAP) dans le ring 0 puisque la MMU bascule le traitement de l'interruption dans le ring 0. Un algorithme alloue la page ou la cherche dans la TBL et l'écrit dans le registre idoine de la MMU (qui a au préalable indiqué la position de l'indirection la plus rarement utilisée). Le RTI se fait alors dans le ring source et le programme poursuit son exécution normale.



Problème : un défaut de page peut être levé par une opération sur la pile système. Dans ce cas, la MMU envoie une requête de défaut de page au CPU qui tente d'empiler son état et le système plante.



La seule façon que j'ai trouvée pour résoudre ce problème est de toujours avoir la pile mappée, ce que je n'arrive pas à implanter en hard. Est-ce que j'ai raté quelque chose ou ce verrouillage de la pile est effectué en soft ? Et si oui, comment ?



Je ne sais pas si je suis clair, n'hésitez pas à poser des questions si tel n'était pas le cas.



Merci de vos lumières,



JKB


Bon. Comme d'habitude. Plusieurs jours à tenter de trouver une solution, je poste ici et je trouve dans la foulée une solution dans un vieux noyau NetBSD pour 68K.

Après chaque écriture sur la pile, le CPU écrit à l'adresse S-n et verrouille la page dans un registre de la MMU, ce qui alloue si nécessaire la prochaine page de la pile. Le problème ne se pose pas pour le dépilement.

Comme d’habitude, votre post illustre exactement le problème classique des bricolages en urgence en mode "pompier".

Si la MMU n'est pas initialisée au démarrage (et pourquoi ?) et SP pointe sur une page inexistante (et pourquoi ?) traiter dans le même ring aussi bien les interruptions que les exceptions (et pourquoi ?) ne peut que finir par reboucler dans un double fault inifini.

Votre solution de systèmatiquement mapper l'adresse contenu dans SP quelque part sur une nouvelle zone valide n'est qu'un habituel bricolage immonde qui masque le problème au lieu d'en corriger la cause.

La bonne solution : définir une architecture claire, pré-allouer / mapper correctement les piles critiques, et traiter les exceptions avec des mécanismes prévisibles.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required