2

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

在某一时刻,代码通过以下不可用的函数安装 ISR dos.h

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?)。更糟糕的是,这些函数是用汇编语言实现的(毕竟它们需要执行上下文切换......)。是否至少有任何文档涉及整数常量(0x08、0xF2、0xF1)所指的中断向量?谷歌并没有真正想出我可以使用的东西。


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

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

4

2 回答 2

1

请参阅有关 BIOS 中断的维基百科条目;它说:

08h​ IRQ0:由系统定时组件实现;由可编程间隔定时器每秒调用 18.2 次(每 55 毫秒一次)

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

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

于 2012-08-08T18:10:49.383 回答
1

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

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

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

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

于 2012-08-09T20:49:26.773 回答