作者:陆麟
转载请征得作者同意.
1999.12.19
1.VPICD向IOS注册有关中断.IOS会负责维护一个中断调用链,当最后一个中断HOOK告知IOS出错,IOS将中断PASSDOWS到下一个中断HOOK.VPICD本身维护其他VXD向他注册的中断请求.当同时有1个以上设备要求同一IRQ时,VPICD会一一调用所有的相应VXD IRQ处理程序.IRQ0具体被映射到哪个中断号了,我也搞不清楚.你可以用VPICD_Convert_IRQ_To_Int查看.似乎是INT50H.
2.实模式的初始话不一定需要.根据不同的设备有不同的要求.
3.如果堆栈有4G,不可能出现溢出.除非是IA64.你肯定堆栈段被设置为向下增长并且段限为4G么?在我的98SP1上,RING3程序的数据段通常为4G-BE60H.只有RING0程序才能访问这BE60H字节的数据.而且是用30H数据段选择子.这是个0-4G的SELECTOR.由于并非所有地址都有内存对应,更有可能引发页故障.这里涉及到一些WIN32知识.由于WIN32为所有的线程设置了堆栈大小,当他检测到页故障是由于访问堆栈超出预定值时(大小预定值在LINK时可以指定,地址则在运行时由系统指定),系统将页故障映射为堆栈溢出,并调用SEH.如果用户设置了处理堆栈溢出的SEH.用户可以动态地调整堆栈大小.并继续处理.如果用户没有设置SEH.系统就调用缺省的SEH.
也就是说,实际上是页故障,但是到了WIN32应用程序那里就被映射为堆栈溢出.
Best Regards,
Lu Lin
For more information, please visit Inside Programming
http://lu0.126.com
[email protected]
----- Original Message -----
From: Vaxi
To: 陆麟
Sent: Saturday, December 18, 1999 11:24 PM
Subject: Help
我总有几个小问题自己解决不了,在新闻组中又没人答,只好请教你,旺不吝赐教,
小弟这里先谢过了。
Q 01:Windows中,IRQ0 的中断向量号是多少?是否还食与双重异常相同?
如果是的话,Windows 是怎样解决这个冲突的呢?
Q 02: VxD 中的实时模式初始化是否是绝对必要的?或者那些VxD一定需要在实时模式中检测硬件?
Q 03: 在保护模式下,如果堆栈段是以4G为限界的段,那什么时候会出现堆栈溢出的异常呢?