【发布时间】:2013-04-20 18:53:36
【问题描述】:
获取 Linux 内核模块中现有设备类 (struct class) 的指针
大家好!
我正在尝试在现有设备类中注册设备,但在获取指向现有类的指针时遇到问题。内核版本为 Linux 3.3.6。 我可以在模块中创建一个类,获取指向它的指针,然后使用它来注册设备:
*cl = class_create(THIS_MODULE, className);
dev_ret = device_create(*cl, NULL, *dev, NULL, driverName);
但是,我需要在同一个类中使用另一个模块注册另一个设备,但我找不到获取指向现有类的指针的方法。而且我无法在另一个模块中再次创建该类,因为由于类已经存在class_create 返回 NULL 而不是指向device_create 所需类的指针。
我发现:
http://lwn.net/Articles/102500/
通过名称返回指向类的指针的函数:
struct class * class_find(char * name)
但是,当我尝试编译函数时,编译器说它不存在。 我以为这个函数是由内核导出的(我的模块有 GPL 许可证),但它似乎不是。 也许我需要包含一些标题?
我试图重写这个函数,因为它的代码在上面的链接中列出。但是当我尝试使用以下方法迭代 class_subsys 时:
list_for_each_entry(this_class, &class_subsys.kset.list, subsys.kset.kobj.entry)
现在找不到符号class_subsys。我再次认为它是导出到内核的。
我不确定缺少什么。一些标题? 我做错了吗? 还有其他功能可以做到吗?
我想如果我可以从一开始就遍历sysfs,我可以获得指向现有类的指针。
但是我也没有找到如何开始遍历sysfs。
我见过的所有函数都需要指向kobject 或kset 的指针才能开始遍历。但是我什至没有指向sysfs 或内核对象的根的指针,所以我无法开始遍历树来获取类指针。
谁能指点我正确的方向?
【问题讨论】:
-
你引用的链接描述了一个从未进入 Linux 内核的补丁——这就是你无法调用
class_find的原因。这是相关的 LKML 线程:lkml.org/lkml/2004/9/16/83。 -
嗨,你解决了这个问题吗?我也陷入了这个问题。