我只是想知道当我们必须使用这些设置并获取驱动程序 API 时,可能的用例是什么。
我所知道的是数据被保存了,稍后我们可以使用数据来做一些事情。我的问题是我们什么时候真的需要这样做?
/*
* These exports can't be _GPL due to .h files using this within them, and it
* might break something that was previously working...
*/
void *dev_get_drvdata(const struct device *dev)
{
if (dev && dev->p)
return dev->p->driver_data;
return NULL;
}
EXPORT_SYMBOL(dev_get_drvdata);
void dev_set_drvdata(struct device *dev, void *data)
{
int error;
if (!dev)
return;
if (!dev->p) {
error = device_private_init(dev);
if (error)
return;
}
dev->p->driver_data = data;
}
EXPORT_SYMBOL(dev_set_drvdata);
驱动程序核心处理运行驱动程序的不同阶段。您可以将驱动程序代码视为一组回调,例如->probe()
, ->remove()
, 等等。详细信息您可以查看struct platform_driver
or struct pci_driver
定义。
那么,如何在回调之间进行通信呢?
是的,你至少有两种方法:
- 在模块中引入全局变量[通常是坏主意]
- 根据您的情况,在回调参数中指定一些内容
struct device
或其子项(struct pci_dev
例如)。
因此,我们有一个指向私有成员的指针,它可以用作应通过回调传递的有用信息的容器。
为什么我们需要那个?大多数驱动程序请求一些资源并将指向它们的指针保存在probe
阶段。为了避免资源泄漏,您必须在remove
阶段。就是这么用的。
正如所指出的allsey87,另一个有用的模式是通过回调传递设备的当前状态。真实的例子之一是电源管理回调(->suspend()
, ->resume()
, etc).
有趣的是,该书的作者Linux Misc Device:一般保护故障misc_deregister()在具有私有数据分配的驱动程序上问题尝试使用其他设备的驱动程序数据(可通过this_device
成员struct miscdevice
)。然而,正如我们所看到的,misc 设备框架使用该字段来满足自己的需要,用户不得干预。在这种情况下,正确的方法是嵌入struct miscdevice
进入您的自定义结构和使用container_of()
方法(记住 Linux 内核是用 OOP 范式编写的)。例子:https://elixir.bootlin.com/linux/v6.5-rc3/source/lib/test_kmod.c#L121(定义),https://elixir.bootlin.com/linux/v6.5-rc3/source/lib/test_kmod.c#L153(吸气剂)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)