在单线程环境异步调用 - 在Windows上安装定时器/时钟ISR(Install timer/cl

2019-09-21 00:40发布

我炼制一些代码,模拟在x86 Windows系统中的上下文切换调度。 该程序编译在Windows XP(编辑:可能不是Windows 7中)与一些古老的Borland C编译器,被移植到被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);

有没有人有任何想法将设置这些中断服务程序的合理方法(可能与Windows的API?)。 更糟糕的是,该功能是用汇编语言实现的(他们需要执行毕竟上下文切换...)。 是否有至少其中断向量的整数常数(0x08时,0xF2,的0xf1)指任何文件? 谷歌并没有真正拿出的东西,我可以一起工作。


UPDATE:既然是显然不可能得到这些DOS调用工作在Windows 7中,我需要一种方法来异步调用函数的一般单线程环境。

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

Answer 1:

你一定会需要更换tick_isr和和context_switch_isr,因为他们是执行上下文切换的DOS环境。 有没有办法让现有的代码会想尽一切办法在Windows有意义的,即使你可以理智地执行它。

因为在原来的代码中,上下文切换是先发制人,你很可能只是消除这种逻辑完全和使用Windows线程来代替。 据推测,现有的代码包含用于创建和删除上下文的一些套路,而这些可以用相应的Windows API线程函数来代替。

如果您需要确保只有一个线程同时运行,你可以使用SetProcessAffinityMask的过程绑到一个单一的CPU。

另外,您也可以使用调试功能GetThreadContext和GetThreadContext来实现自己的上下文切换。 在这种情况下,你会对主程序代码一个线程运行的上下文转换的第二线程。



Answer 2:

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

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

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

您可以效仿中断使用Windows的调度用户模式调度和纤维 。



文章来源: Install timer/clock ISR on Windows - Asynchronous call in a single threaded environment