让我们假设我们有一些简单的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并且无法阻止更快地获得这些知识:(
答案 0 :(得分:1)
device1和device2会使用相同的some_function对象和相同的count变量,还是会得到完全不同的实例?
是的,他们将使用相同的功能和数据。 Linux内核是一个单片内核,所有符号(驱动程序和核心功能)都加载到内存中,内核的每个其他部分都可以访问。 Init / probe可以在不同的核心上发生,因此您需要正确保护或原子访问任何共享数据。在你的例子中,一个简单的原子递增/递减就可以了。