【问题标题】:get pointer for existing device class (struct class) in Linux kernel module获取 Linux 内核模块中现有设备类(结构类)的指针
【发布时间】: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。 我见过的所有函数都需要指向kobjectkset 的指针才能开始遍历。但是我什至没有指向sysfs 或内核对象的根的指针,所以我无法开始遍历树来获取类指针。

谁能指点我正确的方向?

【问题讨论】:

  • 你引用的链接描述了一个从未进入 Linux 内核的补丁——这就是你无法调用class_find 的原因。这是相关的 LKML 线程:lkml.org/lkml/2004/9/16/83
  • 嗨,你解决了这个问题吗?我也陷入了这个问题。

标签: linux driver device


【解决方案1】:

我认为输入核心是这样完成的,这里是sn-p

看看:https://github.com/torvalds/linux/blob/master/drivers/input/input.c#L1720

最好的问候!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    相关资源
    最近更新 更多