我写为一个PCI设备Linux设备驱动程序。该设备执行DMA操作。当该程序的DMA操作运行时崩溃的问题出现。

实际上,崩溃的情况下,device_remove()函数由系统调用(仿佛close()被称为)。这个函数由所述PCI设备所使用的存储器区域中的清理,正确地释放所分配的存储器。我的意思是它正常工作正常的情况下。

但是,如果DMA正在运行,当它实际上将终止,也不会是能够执行DMA清理,因为它不能访问了对已释放了设备数据。一个简单的解决办法是在接近()函数来等待。 (这是我的理解,但也许永远不会执行的DMA功能的最后一部分?)

这是个好主意,哀号的DMA在device_remove()实际终止(又名close())的设备驱动程序的功能?还有没有其他的手段来解决这个问题?

有帮助吗?

解决方案

是的,等待应该工作,但:

除非你想你的PCI设备的测试意外删除的行为,我想打电话给删除()当你有DMA从设备能上/应该失败。另外,我不认为close()方法可以治疗同样的方式删除()。后者将要从存储器完全删除所有设备相关的数据结构(例如:看到网络设备驱动程序中的一个)。因此,换句话说,我所想说的是:等待()上接近(),但不能()上删除()

另外根据您的情况,您可能也想看看的为设备相关的资源的释放引用计数

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top