我正在改进一些在 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?)。更糟糕的是,这些函数是用汇编语言实现的(毕竟它们需要执行上下文切换......)。是否至少有整数常量(0x08、0xF2、0xF1)引用的中断 vector 的文档? Google 并没有真正想出我可以使用的东西。
更新:由于显然不可能让这些 DOS 调用在 Windows 7 中工作,因此我需要一种在一般单线程环境中异步调用函数的方法。
在 Linux 下,signal()
和 raise()
函数可以执行此操作,但在 Windows 下,仅以尽可能少的方式支持它们。 Windows下有办法实现吗?
最佳答案
您肯定需要替换tick_isr 和context_switch_isr,因为它们正在为DOS 环境实现上下文切换。现有代码不可能在 Windows 中执行任何有意义的操作,即使您可以明智地执行它。
由于在原始代码中,上下文切换是抢占式的,因此您可能可以完全消除该逻辑并使用 Windows 线程。想必现有的代码有一些创建和删除上下文的例程,这些例程可以替换为相应的 Windows API 线程函数。
如果您需要确保一次只有一个线程运行,您可以使用 SetProcessAffinityMask将进程绑定(bind)到单个 CPU。
或者,您可以使用调试功能GetThreadContext和 SetThreadContext实现您自己的上下文切换。在这种情况下,您将拥有一个用于主程序代码的线程和一个运行上下文切换器的第二个线程。
关于c - 在Windows上安装定时器/时钟ISR - 单线程环境中的异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11870152/