3

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

实际上,当崩溃时,该device_remove()函数被系统调用(就像close()被调用一样)。该函数对 PCI 设备使用的内存区域进行清理,正确释放分配的内存。我的意思是它在正常情况下可以正常工作。

但是,如果 DMA 正在运行,当它实际终止时,它将无法执行 DMA 清理,因为它不再有权访问已释放的设备数据。一个简单的解决方案是在 close() 函数中等待。(这是我的理解,但也许DMA函数的最后一部分永远不会执行?)

device_remove()为 DMA 实际终止设备驱动程序的(aka close()) 功能而哀号是个好主意吗?有没有其他方法来处理这个问题?

4

1 回答 1

2

是的,等待应该可以,但是:

除非您尝试测试 PCI 设备的意外删除行为,否则我认为当您有 DMA 进出设备时调用 remove() 应该会失败。另外,我不认为 close() 可以与 remove() 一样对待。后者将从内存中完全删除所有与设备相关的数据结构(例如:查看其中一个网络设备驱动程序)。所以,换句话说,我想说的是:wait() on close() but fail() on remove()

此外,根据您的情况,您可能还想查看引用计数以释放与设备相关的资源。

于 2010-05-12T13:17:39.547 回答