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