阅读:1387回复:14
死机?
在windows 2000 下我写了一个dma的程序从卡上读一次数据,但是驱动安装好后。当从新启动机器后出现了蓝屏现象,出现了下面的提示:
PAGE_FAULT_IN_NONPAGED_AREA.和 IRQL_NOT_LESS_OR_EQUAL请指点一下这是什么原因?好象是页面和中断的错误是么? |
|
沙发#
发布于:2004-04-21 18:58
你WINDBG调试看看,是什么错误.
|
|
|
板凳#
发布于:2004-04-22 08:34
谢谢,你的回复,我先是一下吧。
|
|
地板#
发布于:2004-04-22 08:59
DMA内存不能分页~~~~~~~~~~~而且DMAC必须使用物理内存地址编程~~~~~
|
|
地下室#
发布于:2004-04-22 09:06
WOWOCOCK 我用的是driverstudio写的程序,用windbg能够调试么?还有,就是机器启动后就蓝屏了,这个怎么能够调试么?
|
|
5楼#
发布于:2004-04-22 09:11
是的,我是使用的非分页的内存!整个DMA中就只有个KTransfer类的对象才用了内存而且是非分页的内存。
还有出现的错误是不是内存的错误和中断错误? |
|
6楼#
发布于:2004-04-22 09:12
WINDBG可以完全控制发生的异常,比SOFTICE功能更强大,在启动的时候蓝屏,WINDBG会跳出来,并显示相关的信息,建议你在VM里调试,对机器也没什么损伤。
|
|
|
7楼#
发布于:2004-04-22 09:20
你能够说一下在WINDBG里面怎样调试驱动么?在WINDBG里打开应打开哪个驱动的文件进行调试是SYS还是其他的文件?我用的是DRIVER STUDIO写的程序应该打开哪个文件调试?
VM是怎么设置的? |
|
8楼#
发布于:2004-04-22 09:32
WinDbg是DDK为W2K提供的吧~~~~~~~~~DS能用么?
|
|
9楼#
发布于:2004-04-22 09:35
你有没有访问不存在的内存啊?或者在DISPATCH_LEVEL或者更高的中断级上访问了分页内存?????
|
|
10楼#
发布于:2004-04-22 11:28
你能够说一下在WINDBG里面怎样调试驱动么?在WINDBG里打开应打开哪个驱动的文件进行调试是SYS还是其他的文件?我用的是DRIVER STUDIO写的程序应该打开哪个文件调试? WINDBG好专业哦!配制复杂哦,双机才能调试内核 打开SYS文件。 VM是虚拟机吧?有类似软件,可以虚拟一个操作系统在另一操作系统之上 |
|
|
11楼#
发布于:2004-04-22 11:29
你能够说一下在WINDBG里面怎样调试驱动么?在WINDBG里打开应打开哪个驱动的文件进行调试是SYS还是其他的文件?我用的是DRIVER STUDIO写的程序应该打开哪个文件调试? 可以调试 WINDBG好专业哦!配制复杂哦,双机才能调试内核 打开SYS文件。 VM是虚拟机吧?有类似软件,可以虚拟一个操作系统在另一操作系统之上 |
|
|
12楼#
发布于:2004-04-22 11:49
参考本站首页的
JIURL的借助VMware实现单机使用WinDbg |
|
|
13楼#
发布于:2004-04-22 15:06
谢谢各位的帮助我那个死机的问题是把那个卡上的存储空间地址弄错了
。非法访问到了CPU的存储空间。 |
|
14楼#
发布于:2004-04-22 15:32
在武安和的书里有个PCI9054DMA传输的例子,有段获取段描述符的代码如下:
while (pXfer->SequenceTransferDescriptors(&ptd)) { // program the h/w using ppTD t << \" Physical address 0x\" << ptd-_PhysAddr.LowPart << \". Length is 0x\" << ptd->td_Length << \".\" << EOL; } if ((ULONG) pXfer->BytesRemaining() == I.ReadSize()) StartDMA(ptd->td_PhysAddr.LowPart,ptd->td_Length); } 他在设备描述结构中设置dd.ScatterGather=FALSE;不支持分散聚集传输,也就是说在整个DMA缓冲区只有一个段描述,他为什么要用个WHILE循环来调用SequenceTransferDescriptors())反复的获取段描述符。 能不能调用SequenceTransferDescriptors())函数一次就把地址和长度 传给StartDMA()? |
|