获取 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
或内核对象的根的指针,所以我无法开始遍历树来获取类指针。
谁能指出我正确的方向?
最佳答案
我认为输入核心是这样完成的,这里是代码片段
看看:https://github.com/torvalds/linux/blob/master/drivers/input/input.c#L1720
最好的问候!
关于linux - 获取 Linux 内核模块中现有设备类(结构类)的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16123973/