2013-04-20 75 views
5

获得在Linux内核模块得到指针在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/

,通过它的名字返回一个指向A类功能:

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。 我见过的所有函数都需要一个指向kobjectkset的指针来开始遍历。但我没有指针,甚至没有指向sysfs或内核对象的根目录,所以我无法开始遍历树来获取类指针。

任何人都可以指出我正确的方向吗?

+1

你所引用的链接描述了从未进入Linux内核补丁 - 这就是为什么你不能调用'class_find'。这里是相关的LKML线程:https://lkml.org/lkml/2004/9/16/83。 – 2014-03-26 17:50:35

+0

嗨,你有没有解决这个问题?我也陷入了这个问题。 – xianyu1337 2014-05-21 12:30:09

回答