Chinaunix

标题: 硬件发出中断后死机的问题? 用gdb怎么跟踪死机的痕迹? [打印本页]

作者: guoissac    时间: 2013-04-12 19:55
标题: 硬件发出中断后死机的问题? 用gdb怎么跟踪死机的痕迹?
我现在用一个PCI板卡产生中断,中断周期设定在10ms, 中断一开始就马上死机,只剩下屏幕光标在闪,键盘全部失效了。
问,碰到这种情况该怎么办?
用KGDB跟踪,单步执行到硬件发出中断的指令后,目标机同样死掉,只剩下屏幕光标闪;根本就进不到中断处理程序里面去。
但是我跟踪 request_irq( )是正常的。
请问有什么办法能抓住死机的痕迹?像这样一下死掉,任何反应都没有,不知道该怎么跟踪,发现问题?
我现在用DDD调试,有什么命令能够继续我内核深处跟踪,找到死机的根源?

麻烦各位前辈指教一下。
作者: 一剑封尘    时间: 2013-04-12 20:02
看看                                             
作者: folklore    时间: 2013-04-12 20:08
单步执行到硬件发出中断的指令后

猜:写错Register了。
作者: guoissac    时间: 2013-04-12 20:25
回复 3# folklore


    我也跟你有同样的怀疑,
但是我是有一个这个板卡windows下的驱动程序。这个windows下的驱动一切正常;
我先对这个windows驱动源码用softice一步一步验证了各个register的读写内容;
然后按照同样的方法,对linux下的驱动用DDD 一步一步跟踪,实在找不出register的问题。

作者: folklore    时间: 2013-04-12 21:29
回复 4# guoissac


    pci的端口号不是固定的, 如果Windows下正好分配到可用的端口号, 则无事, Linux下分配到不是期望的端口号,则死了。
先看看有没有做端口号是否分配成功检测(及定位到正确的基地址)。


PS: Softice还能在Windows 7下跑?或者你还在用xp?

作者: guoissac    时间: 2013-04-12 22:35
回复 5# folklore

感谢您的指点,我再去验证一下。

   
作者: guoissac    时间: 2013-04-14 15:10
回复 4# guoissac


    感谢folklore先生的指点,我又仔细折腾了一遍我的驱动代码,发现对PCI基地址和PCI 的Register的操作代码还是有问题;
后来又搜到一篇文章,是翻译 /Documentation/PCI/pci.txt的;但是译的不好,于是又仔细读了原文,发现这么一段:

3.2 Request MMIO/IOP resources
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Memory (MMIO), and I/O port addresses should NOT be read directly from the PCI device config space.
Use the values in the pci_dev structure as the PCI "bus address" might have been remapped to a "host physical" address by the arch/chip-set specific kernel support.

然后看了我自己的代码,发现没有按照上面这段话说的那样"Use the values in the pci_dev structure" , 我把pci_resource_start()获得的BAR 赋值给了另外一个变量,后面对Register的操作都是通过这个变量来进行,导致死机。

改为 “Use the values in the pci_dev structure”,问题解决;

现在中断程序跑得哗哗的。

感谢folklore先生的指点,感谢各位。





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2