阅读:1801回复:8
难道在VxD中共享IRQ这个问题真的这么难吗?
为什么没有人回答这个问题?版主,难道您也不知道吗?
|
|
|
沙发#
发布于:2001-11-26 18:45
我有一个想法,PCI共享中断的功能应该是每一个PCI设备的驱动程序都提供的,也就是说所有的做过PCI设备驱动程序的人都应该对此有所了解,但是我问了这个问题却没有人回答。那么只有两种可能:一、上这个网站的所有做PCI设备驱动程序的人所做的driver中都没有添加这个功能,所有的这些驱动程序都有bug;二、所谓的高手们就指着这点知识充高手呢,告诉了别人岂不是砸了自己的饭碗。
总之,要么是这里的人水平有限,要么是这里的人情味太差,看来我只能去国外的网站去问了,不管他们的答案对是不对,至少还会有人和我讨论我的问题。 |
|
|
板凳#
发布于:2001-11-27 09:41
首先,声明我不是高手。
其次,你在短短的7个小时之内连发2个贴子,以为别人一定会看见吗?这里有谁是随时挂在这个bbs上,随时准备给别人回答问题的呢? 另外,这个问题不要点名问我。我没有做过driver里的中断,vxd的也没有,所以没有什么可说的。 最后,如果你到鬼子那里问到了答案,是否可以在这里贴出来呢?既然这里都是愚人,本着中国人互相帮助的精神,您老人家是否可以给大家一点指点呢? |
|
|
地板#
发布于:2001-11-27 11:38
本来很简单的问题给你弄得这么复杂:
1。定义一个struct typedef struct _INTERRUPT_CONTEXT{ DWORD ServiceRoutine; DWORD ServiceContext; BYTE SharedVector; }INTERRUPT_CONTEXT, *PINTERRUPT_CONTEXT; 在你的程序里作如下处理: IRQHANDLE MyIRQHandle; VPICD_IRQ_Descriptor Vid; INTERRUPT_CONTEXT context; context.ServiceRoutine = yourServiceRoutine; context.ServiceContext = yourServiceContext; context.SharedVector = shared; memset(&Vid, 0, sizeof(VPICD_IRQ_Descriptor)); Vid.VID_IRQ_Number = Vector; Vid.VID_Options = VPICD_OPT_REF_DATA | (ShareVector ? VPICD_OPT_CAN_SHARE : 0); Vid.VID_Hw_Int_Proc = ULONG(__isr_Routine); Vid.VID_Hw_Int_Ref = &context; MyIRQHandle = VPICD_Virtualize_IRQ(&Vid); VPICD_Physically_Unmask(MyIRQHandle); 写一个__isr_Routine NAKED VOID __isr_Routine() { _asm{ push edx;//保存context mov al, [edx.SharedVector]; test al, al; jnz shared; mov eax, MyIRQHandle; VxdCall(VPICD_Phys_EOI); shared: mov ebx, [edx.ServiceRoutine];//取得你的中断例程 push [edx.ServiceContext];//压ServiceContext入栈 call ebx; //调用你自己的例程 test eax,eax//你的中断程序返回false,表示中断不是你的 jnz next; stc; ret; next: pop edx; mov al, [edx.SharedVector]; test al,al; jnz nextcode; clc;//中断已经成功处理 ret; nextcode: mov eax, MyIRQHandle;//共享中断 VxDCall(VPICD_Phys_EOI); clc; ret; } } 共享中断,那么应该是电平触发(level trigger) 如果你懂得写驱动,后面的不用我再写了(你求人帮忙,语气应该客气点)。 代码为伪代码,临时写成(以前的早就给忘了),可能有误! |
|
地下室#
发布于:2001-11-28 09:19
多谢dazzy给大家上了一课(虽然我不懂)。 :D
|
|
|
5楼#
发布于:2001-11-28 12:42
对不起,dazzy,您所写的代码我也知道,而且我也是这样实现的。DDK的例程和很多书里都有类似的代码。但是我的问题是这样也是不能完全share(和USB设备会有冲突)。据Numega的人说,好像需要hook几个函数,但是具体是哪几个呢?
其实我写那些话也是实在有些着急,因为我认为Share IRQ确实应该是一个比较普遍的问题,确实应该有很多人知道。而且我的这个问题也不是只在7个小时内问的,我确实已经贴了好几天了(在另外一个帖子中)。 |
|
|
6楼#
发布于:2001-11-28 12:56
对了,给大家提个建议:在测试自己的driver的时候,把BIOS里的\'Assign IRQ to USB\'选项打开(好像是这个名字),然后再把PCI可用的中断只开一个,这样如果你的driver不支持Share IRQ的话,就肯定会死机。
|
|
|
7楼#
发布于:2001-11-29 15:29
多谢你的热心提醒。我有空的时候也试一试。
对于不用到中断的设备,应该就没有影响了吧? |
|
|
8楼#
发布于:2001-11-29 18:12
不用到中断的设备当然不用考虑这些,之所以导致死机是因为中断被错误的中断服务例程所处理了。
|
|
|