Salut
je suis en train de coder une noyau "multitâches" avec Nasm et je me trouve face au problème suivant:
j'ai une file d'attente de processus utilisateurs (interruptibles) et un processus horloge réveillé par l'IT 1Ch ayant pour but de donner la main à tour de rôle aux processus de la file d'attente mais lorsque je mets plus d'un processus utilisateur, le deuxième à prendre la main n'est plus interruptible alors que IF=1 (j'ai vérifié). Je ne comprends pas ce qui peut rendre ce processus ininterruptible (étant donné qu'entre temps je ne restaure pas l'it 1Ch).
De plus, quand ce second processus se termine et que le premier reprend la main, celui-ci est bien interruptible, comme il l'était avant de donner la main au processus n°2.
Si quelqu'un sait ce qui peut rendre un processus non interruptible, mis à part IF=0, ça me rendrait bien service car je crois que c'est le dernier bug qu'il me reste.
Bon j'espère que mes explications sont assez claires car je ne peux pas mettre de code, ça ferait un peu lourd un noyau entier dans un post.
Bon j'ai fini par trouver ce qui n'allait pas
en fait pour faire du multitâche, chaque processus utilise une pile qui lui est propre. Lorsque l'horloge génère une interruption, l'adresse de retour de la procedure en cours est sauvée dans sa pile, la procédure d'interruption sauvegarde tous les registres dans cette même pile et rend la main à un processus utilisateur différent. Le problème est que pendant tout ce temps le contrôleur d'interruptions n'as toujours pas reçu de signal de fin d'interruption (EOI) donc elles ne sont plus prises en compte. Le deuxième processus utilisateur est donc ininterruptible même si le flag IF les autorise.
La solution que j'ai apportée n'est sans doute pas des plus élégantes mais je la donne quand même:
envoyer au début de chaque processus utilisateur le signal de fin d'interruption au pic 8259