【问题标题】:Linux device driver: is the code shared between multiple devices using the same driver?Linux 设备驱动程序:代码是否在使用同一个驱动程序的多个设备之间共享?
【发布时间】:2016-08-09 17:14:07
【问题描述】:

假设我们有一些简单的 linux 设备驱动程序,其中:

static const struct of_device_id driver_match[] = {
     { .compatible = "vendor,device1" },
     { .compatible = "vendor,device2" },
     {},
};

这样device1device2 将绑定到同一个驱动程序。我们在驱动里面也有如下函数:

static int some_function(int never_mind)
{
    static int count = 0;
    // print "count" to the logs
    ....
}

在设备的probe() 函数期间调用了几次。让我们假设设备“同时”初始化。 我的问题是它将如何工作? device1device2 会使用相同的 some_function 对象和相同的 count 变量,还是会得到完全不同的实例?

关于 linux 驱动程序/模块的实际执行方式是否有一些好的资源/书籍可用?我只能找到很多关于“如何编写驱动程序”的教程。

我很抱歉我不得不问这个问题而不是准备基本驱动程序并自己检查这个问题,但我正在等待我的第一个支持 linux 的 SoC 并且无法抗拒更快地获得这些知识:(

【问题讨论】:

  • “假设设备“同时”初始化。” -- 错误的假设。 Linux内核一次执行一个内置模块的init例程。请参阅init/main.c 中的 do_initcalls()。在这个引导阶段,只有一个(SMP 系统的)处理器处于活动状态。 “我们在驱动程序中还有以下功能:” -- 设备驱动程序中正确编写的例程应该是可串行重用的代码,以便支持多个设备实例。
  • 这并不是完全错误的假设。您必须将其更正为“该设备由同一驱动程序管理”。您可以参考__device_attach_async_helper()

标签: linux linux-kernel linux-device-driver


【解决方案1】:

device1 和 device2 会使用相同的 some_function 对象和相同的计数变量,还是会得到完全不同的实例?

是的,他们将使用相同的功能和数据。 Linux 内核是一个单片内核,其中所有符号(驱动程序和核心功能)都加载到内核的每个其他部分都可以访问的内存中。初始化/探测可能发生在不同的内核上,因此您需要正确保护或自动访问任何共享数据。在您的示例中,一个简单的原子增量/减量就可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    相关资源
    最近更新 更多