在Windows上安装定时器/时钟ISR – 在单线程环境中进行asynchronous调用

我正在精炼一些模拟x86 Windows系统上下文切换调度程序的代码。 该程序编译在Windows XP(编辑:可能不是Windows 7)与一些古老的Borland C编译器,并被移植到MSVC编译。

有一点,代码在dos.h通过这些不可用的函数来安装ISR:

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

具体来说,代码为(循环)定时器中断安装一个ISR。 电话是:

 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); 

有没有人知道什么是设置这些ISR(使用Windows API可能?)的合理方法。 更糟糕的是,这些函数是用汇编语言实现的(毕竟它们需要执行上下文切换…)。 是否至less有任何中断vector整型常量(0x08,0xF2,0xF1)引用的文档? 谷歌并没有真正想出我可以合作的东西。


更新 :由于显然不可能让这些DOS调用在Windows 7中工作,所以我需要一种在通常单线程环境中asynchronous调用函数的方法。

在linux下, signal()raise()函数可以做到这一点,但是在Windows下它们只能以最小的方式得到支持。 有没有办法在Windows下实现?

Solutions Collecting From Web of "在Windows上安装定时器/时钟ISR – 在单线程环境中进行asynchronous调用"

您肯定需要替换tick_isr和context_switch_isr,因为它们正在为DOS环境实现上下文切换。 现有的代码无法在Windows中做任何有意义的事情,即使你能够明智地执行它。

由于在原始代码中,上下文切换是抢占式的,因此您可能完全消除该逻辑,而是使用Windows线程。 据推测,现有的代码有一些用于创建和删除上下文的例程,可以用相应的Windows API线程函数替换。

如果您需要确保一次只运行一个线程,则可以使用SetProcessAffinityMask将进程绑定到单个CPU。

或者,您可以使用调试函数GetThreadContext和SetThreadContext来实现您自己的上下文切换。 在这种情况下,您将有一个主程序代码的线程和运行上下文切换器的第二个线程。

查看关于BIOS中断的维基百科条目 ; 它说:

08h IRQ0:由系统定时组件实现; 称为可编程间隔定时器,每秒18.2次(每55 ms一次)

在Windows 7上,您将需要创建内核模式驱动程序来访问中断。

您可以使用Windows 用户模式调度和光纤为您的调度程序模拟中断。