Question

Dans le manuel des développeurs de logiciels Intel, il dit que les vecteurs d'interruption 32-255 sont généralement définis par l'utilisateur pour les périphériques d'entrées-sorties externes. Dans ma classe de programmation de systèmes, je dois développer un pilote de périphérique simple. Ma question est de savoir comment puis-je définir un vecteur d'interruption spécifique à utiliser pour un dispositif spécifique? Est-ce fait avec le BIOS?

Note: nous développons un Cependant, le système d'exploitation simple si ma situation est tout à fait spécifique, à la fin je besoin de comprendre comment tout cela se passe sur un système x86. Actuellement, notre système est mis en place afin que quelques vecteurs d'interruption 32 ci-dessus sont affectés à des périphériques comme un port série et le clavier. En lisant la fiche technique du contrôleur Intel 82801EB ICH5 IO, en particulier la section concernant les 8259 PICs, il est dit que IRQ15 est le canal IDE secondaire. Comment serait-ce éventuellement être mis sur la pile comme vecteur d'interruption?

Je peux juste être si confus que cette question n'a pas de sens, donc je me excuse à l'avance.

EDIT: Donc, notre classe de programmation de systèmes a un système d'exploitation très simple, qui a des routines du noyau pour l'installation ISRs pour gérer les interruptions spécifiques étant donné le nombre de vecteurs. Dans notre classe dernier trimestre, le professeur nous a donné un fichier d'en-tête qui a défini le clavier comme numéro de vecteur 0x2c ou quelque chose de similaire. J'essaie de savoir comment mapper le canal IDE primaire et / ou secondaire interrompt à diverses ISRs en utilisant nos routines du noyau. Pour l'instant, tous les vecteurs d'interruption non utilisés ont un gestionnaire par défaut qui imprimerait messages si une interruption est survenue, si les interruptions IDE ne sont même pas sur le moment, mais cela est une autre question.

Était-ce utile?

La solution 5

Eh bien, il me semble avoir trouvé la réponse dans notre code de soutien, en particulier la routine d'initialisation PIC. Avec les lignes IRQ de code suivants sont mappés à 20h et 28h de décalage dans le IDT pour les photos maître et esclave, respectivement.

/* ICW2: master offset of 20 in the IDT, slave offset of 28 */

__outb( PIC_MASTER_IMR_PORT, 0x20 );
__outb( PIC_SLAVE_IMR_PORT, 0x28 );

Cela signifie que le clavier a été mis en correspondance avec le numéro de vecteur 2c et les canaux primaires et secondaires sera mappé à 2E et 2F, respectivement. Certains d'entre vous pourraient probablement me ont donné de meilleures réponses si j'avais posé la question mieux, mais j'apprécie l'aide quand même!

Tableau 45 de la fiche 82801EB ICH5 détaille les lignes IRQ du 8259, et dans mon OS maître est simplement chargé à 20h de décalage et l'esclave est 28h.

Merci!

Autres conseils

Vous pouvez programmer à la carte certains périphériques IRQ du PIC (contrôleur d'interruption programmable).

Sur x86, il y a deux PIC qui sont connectés en guirlande donnant IRQ0-IRQ17. IRQ0-7 est géré par le 8259 et IRQ8-15 par un second 8259. Les premiers signaux et l'unité centrale de traitement est le maître, le second (l'esclave) de signalisation de la première.

Le IDT (table de descripteurs d'interruption) mappe les interruptions aux adresses des ISR (routines de service d'interruption). Interruptions peuvent être directement élevés avec l'instruction INT (pièges logiciels).

Par exemple, pour lever interruption 0x80, exécutez INT 0x80.

Pour gérer 0x80, mov [0x80*4], int_80_handler. En supposant une architecture 32 bits, l'adresse de la fonction int_80_handler est maintenant enregistrée à l'emplacement de 0x80'th dans le IDT.

Vous trouverez ces utiles:
http://en.wikipedia.org/wiki/Intel_8259
http://en.wikipedia.org/wiki/Interrupt_Handler
http://en.wikipedia.org/wiki/Interrupt
http://en.wikipedia.org/wiki/Interrupt_descriptor_table

Il a été un moment que j'ai eu affaire à ce genre de choses si cela peut être éteint: Je me rappelle que le contrôleur d'interruption PC dispose de 15 lignes IRQ. Ces carte à x86 adjacents spécifiques vecteurs d'interruption. Alors, quand un périphérique déclenche une ligne IRQ, le PIC interrompt le CPU et indique quel vecteur de sauter, comme si l'instruction a été exécuté INT correspondant. Certains IRQ sont à certains périphériques hardcoded, mais je crois que les périphériques PCI négocient avec le système d'exploitation pour d'autres et IRQs ressources (comme le font l'héritage des périphériques ISA PnP).

Je ne comprends pas ce que vous entendez par «Comment serait-ce éventuellement être mis sur la pile comme vecteur d'interruption?

Il y a deux façons possibles pour un dispositif pour obtenir une interruption:

  1. Utilisez le Plug and Play ou d'un mécanisme Pci. Si vous le faites le BIOS appeler votre appareil peripherical et demander les besoins en ressources. Ensuite votre pilote peut énumérer les périphériques plug-and-play, recherchez le périphérique pris en charge et obtenir l'interruption matérielle de l'appareil.

  2. Comment ça a été fait dans les premiers jours: Il suffit d'utiliser une interruption. Ajouter un commutateur DIP sur le dispositif qui permet à l'utilisateur de choisir entre les différentes interruptions. L'allocation des ressources est à la main des utilisateurs maintenant. L'utilisateur transmettra également le numéro d'interruption au conducteur au moment de la charge en quelque sorte.

Maintenant, comment raccorder l'interruption. Cela dépend du système d'exploitation et le mode x86 est en cours d'exécution en cas d'un système d'os nu, nu, vous pouvez interroger l'IDT (Interrupt Descriptor Table) via une instruction spéciale. Une fois que vous avez ce IDT, vous pouvez obtenir l'adresse et percez l'adresse du gestionnaire IRQ dans la fente appropriée. Pour le mode réel, je ne sais pas comment cela se fait plus.

Si vous avez au moins un peu en temps réel OS ou quelque chose sous OS semblable, il est probable qu'il existe déjà une fonction de noyau qui fait le travail pour vous.

Si je me souviens il y a une table de vecteur au début de l'espace mémoire qui pointe vers la routine à appeler lorsque se produit une interruption spécifique. Je frappais à être un niveau trop bas ici (ancien programmeur de montage x86) mais au niveau de base que vous obtenez votre vecteur installé dans ce tableau, votre routine est appelée. Je n'ai pas eu l'un de mes vieux matériel de référence avec moi ne peut donc pas vous donner les appels réels, mais je serais surpris si la méthode officielle du fonctionne en dehors du BIOS.

Dans ces jours de GUIs Je suis sûr qu'il existe d'autres méthodes plus appropriées, qui permettent le partage des interruptions et toutes ces bonnes choses.

EDIT: Ignorer une grande partie de cela, je viens de voir que vous êtes à la recherche d'interruption 16 ans et plus qui sont en dehors des interruptions matérielles. Je me suis éloigné de ce niveau de programmation avant il y avait des éléments intéressants de matériel dans cet espace, donc je ne jamais eu affaire les 15 premiers IRQs (le 16 étant la cascade entre les contrôleurs). Je laisse juste au cas où il est intéressant à quelqu'un d'autre:)

21H / AH = 25h - définir vecteur d'interruption; entrée: AL = nombre d'interruption. DS:. DX -> nouveau gestionnaire d'interruption

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top