阅读:5234回复:16
怎么解决IRQL_NOT_LESS_OR_EQUAL的错误
刚开始运行测试程序还没问题,运行了十几次后,弹出softice窗口,提示有这样的错误:STOP: 0x000000D1 (0x00000018, 0x00000002, 0x00000001, 0xBCB8940F)
Driver_IRQL_NOT_LESS_OR_EQUAL ADDRESS BC8E540F,DATASTAMP 373BB6E3-XXXX.SYS Begning dump of physical memory 是不是引用了过多分页内存的问题?还是irql的问题。 |
|
最新喜欢:leavep...
|
沙发#
发布于:2002-05-14 17:03
在该irql访问了不对应的内存。
好象是在高中断级访问了分页内存。 |
|
|
板凳#
发布于:2002-05-14 19:22
这是我的isr,高手看看,有什么不对?
m_IntStatus=m_CsrMemoryRange.ind((ULONG)0x0008);//IF MASK ? DbgPrint(\"m_IntStatus=%x\\n\",m_IntStatus); if((m_IntStatus&0x80000001)!=0x80000001) return FALSE; m_IntStatus1=m_CsrMemoryRange.ind((ULONG)0x0000); DbgPrint(\"m_IntStatus1=%x\\n\",m_IntStatus1); if((m_IntStatus1&0x0001)==0x0001) { m_CsrMemoryRange.outd((ULONG)0x0004,(ULONG)0x0001); m_IntStatus2=m_CtlMemoryRange.inw((ULONG)0x0000); DbgPrint(\"m_IntStatus2=%x\\n\",m_IntStatus2); if((m_IntStatus2&0x0808)==0x0808) { m_CtlMemoryRange.outw((ULONG)0x0000,0x0b0b); t << \"Interrupt Occur!\\n\"; m_DpcFor_Irq.Request(NULL, NULL); return TRUE; } else { return FALSE; } } else { return FALSE; } |
|
|
地板#
发布于:2002-05-14 19:34
ISR里面不能使用分页内存。
一般工作irql必然比apc level 高的。 [编辑 - 5/14/02 by zdhe] |
|
地下室#
发布于:2002-05-14 19:39
能否具体针对我这个指点一下。
|
|
|
5楼#
发布于:2002-05-14 23:44
把所有关于内寸分配,数据结构定义关系的东西都贴出来才能分析
否则你让大家怎么猜呢? 用的时候出错了,不一定是某句代码的问题. |
|
6楼#
发布于:2002-05-15 08:42
这是我的一段代码
NTSTATUS Pci2040Device::PCI_READWORD_Handler(KIrp I) { NTSTATUS status; PULONG *pBuffer; ULONG ByteOffset; USHORT Data_Receive; PCHAR *pAddr; ULONG length; t << \"Entering Pci2040Device::PCI_READWORD_Handler, \" << I << EOL; // TODO: Verify that the input parameters are correct // If not, return STATUS_INVALID_PARAMETER // TODO: Handle the the PCI_READWORD request, or // defer the processing of the IRP (i.e. by queuing) and set // status to STATUS_PENDING. // TODO: Assuming that the request was handled here. Set I.Information // to indicate how much data to copy back to the user. pBuffer=(PULONG*)I.IoctlBuffer(); ByteOffset=(ULONG)pBuffer[0]; DbgPrint(\"ByteOffset: %x\\n\",ByteOffset); Data_Receive=(USHORT)m_CtlMemoryRange.inw((ULONG)ByteOffset); DbgPrint(\"Data_Receive: %x\\n\",Data_Receive); length=sizeof(Data_Receive); DbgPrint(\"length: %x\\n\",length); if (I.IoctlOutputBufferSize()>=length) { KMemory Mem(I.Mdl()); memcpy(Mem.MapToSystemSpace(),&Data_Receive,length); pAddr=(PCHAR*)Mem.MapToSystemSpace(); DbgPrint(\"pAddr : %x\\n\",pAddr[0]); I.Information() = length; status = STATUS_SUCCESS; return status; } else { I.Information() = 0; return I.Complete(STATUS_BUFFER_TOO_SMALL); } } Devicecontrol中: case PCI_WRITEWORD: pKPciConfiguration->Initialize(m_Lower.TopOfStack());//must init pKPciConfiguration->WriteCommandRegister( 0x0002 ); status = PCI_WRITEWORD_Handler(I); break; OnStartDevice中 pKPciConfiguration=new(NonPagedPool)KPciConfiguration(m_Lower.TopOfStack()); pKPciConfiguration->Control(cmdMemoryAccess,TRUE); //允许内存映射 pKPciConfiguration->Control(cmdIoAccess,FALSE); pKPciConfiguration->ReadHeader(&m_MyConfiguration,0,sizeof(PCI_CONFIG_HEADER_0)); |
|
|
7楼#
发布于:2002-05-15 09:13
建议你使用softice跟踪一下
确定出那行代码使得系统崩溃 然后再分析和该代码有关的其他代码 这叫缩小范围 |
|
|
8楼#
发布于:2002-05-15 13:19
按楼上说的作,是正经。
看source,除非错误明显,被人也只能猜。 我不知道你的device io ctrl flag定义,你怎么就能确认I.Mdl()里是有效的buffer呢? I.Mdl()为NULL时应该使用assoatiateIpr.SystemBuffer 具体使用哪一个根据BUFFERIO, DIRECTIO, NEITHIO来确定。 if (I.IoctlOutputBufferSize()>=length) { KMemory Mem(I.Mdl()); memcpy(Mem.MapToSystemSpace(),&Data_Receive,length); ???? pAddr=(PCHAR*)Mem.MapToSystemSpace(); 其它地方没细看,好好跟跟吧 |
|
9楼#
发布于:2002-05-15 19:54
读写的数据是正确的啊?我只是想问哪儿占用了分页内存。我用directio
|
|
|
10楼#
发布于:2002-05-16 09:34
再给点指点吧,大牛们!
|
|
|
11楼#
发布于:2002-05-16 12:22
感觉你的态度。。。。要知道这是你的工作。不是别人的。
可以猜的大约是下面的东西 m_IntStatus, m_CsrMemoryRange, m_IntStatus1, m_IntStatus2等等是全局变量吧 把所有这一类变量声明再有名的同一个DATA SECTION里,使用 MmLockPagableDataSection把所有再ISR里需要使用的数据都LOCK在内存中。 同时使用MmLockPagableCodeSection把所有isr调用的代码锁定在内存中。 这样,执行中无论数据或者代码都不会被PAGING OUT. |
|
12楼#
发布于:2002-05-16 12:55
大哥,误解我了,我虽是这么问,可别以为我在坐以待毙噢,你所说的这个需要锁定吗?感觉没必要,但我可以试试。
|
|
|
13楼#
发布于:2002-05-16 13:11
是否必然不知道。
呵呵,我遇到过代码和全局变量被swapout的情况。毕竟你不是做文件系统极的玩艺。文件系统的情况下,普通passive,paging io 下apc, completeroutine里极少情况下dispatch,所以无所谓。 你的情况下,可能需要。 你可以不忙改代码,把pagefile 关掉,如果不再出错,就是这个原因了。 ------ 还有,STACK也要小心,在>dispath irql的情况下,如果内存紧张,大于4K就有swapout的可能。 -〉这时我的教训之一。 [编辑 - 5/16/02 by zdhe] |
|
14楼#
发布于:2002-05-16 13:21
多谢!
|
|
|
15楼#
发布于:2003-05-14 20:40
楼上的朋友,你是如何解决你的这个问题的?指点一下阿。
送分! |
|
16楼#
发布于:2010-03-13 10:08
给你指点一下,用WINDBG远程调试,可以直接找到出错的那一行。
怎么安装你自己去找一下。 |
|