【发布时间】:2016-08-09 17:14:07
【问题描述】:
假设我们有一些简单的 linux 设备驱动程序,其中:
static const struct of_device_id driver_match[] = {
{ .compatible = "vendor,device1" },
{ .compatible = "vendor,device2" },
{},
};
这样device1 和device2 将绑定到同一个驱动程序。我们在驱动里面也有如下函数:
static int some_function(int never_mind)
{
static int count = 0;
// print "count" to the logs
....
}
在设备的probe() 函数期间调用了几次。让我们假设设备“同时”初始化。
我的问题是它将如何工作? device1 和 device2 会使用相同的 some_function 对象和相同的 count 变量,还是会得到完全不同的实例?
关于 linux 驱动程序/模块的实际执行方式是否有一些好的资源/书籍可用?我只能找到很多关于“如何编写驱动程序”的教程。
我很抱歉我不得不问这个问题而不是准备基本驱动程序并自己检查这个问题,但我正在等待我的第一个支持 linux 的 SoC 并且无法抗拒更快地获得这些知识:(
【问题讨论】:
-
“假设设备“同时”初始化。” -- 错误的假设。 Linux内核一次执行一个内置模块的init例程。请参阅init/main.c 中的 do_initcalls()。在这个引导阶段,只有一个(SMP 系统的)处理器处于活动状态。 “我们在驱动程序中还有以下功能:” -- 设备驱动程序中正确编写的例程应该是可串行重用的代码,以便支持多个设备实例。
-
这并不是完全错误的假设。您必须将其更正为“该设备由同一驱动程序管理”。您可以参考
__device_attach_async_helper()。
标签: linux linux-kernel linux-device-driver