Installer l’horloge / horloge ISR sur Windows – Appel asynchrone dans un environnement à un seul thread

J’affine un code qui simule un planificateur à commutation de contexte sur des systèmes Windows x86. Le programme est compilé sous Windows XP (probablement pas sous Windows 7) avec un compilateur ancien de Borland C, et il est porté à être compilable par MSVC.

À un moment donné, le code installe les ISR via ces fonctions non disponibles dans dos.h :

 void (*)() getvect(int) void setvect(int, void (*)()); 

Plus précisément, le code installe un ISR pour une interruption de timer (cyclique). Les appels sont:

 tick_isr_old = getvect(0x08); setvect(0xF2, tick_isr_old); setvect(0x08, (void interrupt (*)(void)) tick_isr); setvect(0xF1, (void interrupt (*)(void)) context_switch_isr); 

Quelqu’un at-il une idée de ce qui serait un moyen raisonnable de définir ces ISR (avec l’API Windows peut-être?). Pour aggraver les choses, les fonctions sont implémentées en langage assembleur (après tout, elles doivent effectuer un changement de contexte). Existe-t-il au moins une documentation mentionnant les vecteurs d’interruption auxquels les constantes de nombre entier (0x08, 0xF2, 0xF1) se rapportent? Google n’a pas vraiment développé quelque chose avec lequel je pourrais travailler.


UPDATE : Etant donné qu’il n’est apparemment pas possible de faire fonctionner ces appels DOS sous Windows 7, j’ai besoin d’un moyen d’appeler de manière asynchrone une fonction dans un environnement généralement à thread unique.

Sous Linux, les fonctions signal() et raise() peuvent le faire, mais sous Windows, elles ne sont sockets en charge que de la manière la plus minimale possible. Y a-t-il un moyen d’y parvenir sous Windows?

Vous devrez certainement remplacer tick_isr et et context_switch_isr, car ils implémentent la commutation de contexte pour un environnement DOS. Il n’ya aucun moyen que le code existant fasse quelque chose de significatif dans Windows, même si vous pouviez l’exécuter de manière sensée.

Dans la mesure où, dans le code d’origine, les changements de contexte sont préemptifs, vous pouvez probablement simplement éliminer cette logique et utiliser à la place des threads Windows. Vraisemblablement, le code existant comporte des routines pour la création et la suppression de contextes, qui peuvent être remplacées par les fonctions de thread API Windows correspondantes.

Si vous devez vous assurer qu’un seul thread est en cours d’exécution à la fois, vous pouvez utiliser SetProcessAffinityMask pour lier le processus à un seul processeur.

Vous pouvez également utiliser les fonctions de débogage GetThreadContext et SetThreadContext pour implémenter votre propre commutation de contexte. Dans cette situation, vous auriez un thread pour le code de programme principal et un second thread exécutant le commutateur de contexte.

Voir l’ entrée Wikipedia sur les interruptions du BIOS ; ça dit:

08h IRQ0: implémenté par le composant de synchronisation du système; appelé 18,2 fois par seconde (une fois toutes les 55 ms) par le minuteur programmable

Sous Windows 7, vous devrez toutefois créer des pilotes en mode kernel pour accéder aux interruptions.

Vous pourrez peut-être émuler des interruptions pour votre planificateur à l’aide de la planification et des fibres en mode utilisateur Windows.