pci_enable_device和pcim_enable_device有什么区别?

Tar*_*Tar 7 linux-device-driver linux-kernel pci pci-e

本书PCI章节解释了:

int pci_enable_device(struct pci_dev *dev);
Run Code Online (Sandbox Code Playgroud)

但是还有:

int pcim_enable_device (struct pci_dev * pdev);
Run Code Online (Sandbox Code Playgroud)

但除了声明它是" 托管pci_enable_device "之外,它没有任何解释.

  1. 那么这两者之间的区别是什么?
  2. 这是什么意思,它是"管理"的?
  3. 我应该使用哪一个?

Sam*_*nko 11

pcim_enable_device()是托管版本pci_enable_device().意味着如果你打电话pci_enable_device(),你还需要打电话pci_disable_device()到最后.在这种情况下pcim_enable_device(),托管框架将为您处理禁用操作.

在新的内核版本中,建议使用此类托管函数以消除驱动程序代码中的错误处理.请参阅此文章以获取有关设备资源管理(或devres)API 的线索.这个特殊的函数(pcim_enable_device)是在这个补丁中引入的.如果您想了解有关devres框架的更多信息,请参阅Documentation/driver-model/devres.txt

您提到的这本书("Linux设备驱动程序,第3版")对托管函数没有任何解释,因为它是在实现这些函数之前编写的.

  • 需要注意的是,发布中的`pcim_enable_device()`不仅仅是`pci_disable_device()`. (3认同)
  • 好吧,有LDD4即将到来:http://shop.oreilly.com/product/0636920030867.do.但我现在还记不起任何描述托管功能的书.实际上你不需要一个,只需查看内核源代码中的`Documentation/driver-model/devres.txt`文件.最后归结为下一个:你使用托管函数而不是托管函数,并且最后不要调用任何资源释放函数.一旦您的驱动程序即将退出/卸载,**devres**框架将自动为您调用资源免费功能. (2认同)