【问题标题】:What is the purpose of class and class device?类和类设备的目的是什么?
【发布时间】:2018-07-27 17:09:52
【问题描述】:

我遵循了一些解释如何编写 Linux 内核模块的教程,但我有点困惑。即使在阅读official "documentation"之后,我对这些概念的理解也很差。

创建字符设备(register_chrdev)后,我发现使用以下功能的组合很常见:

class_create

class_device_create

device_create

我不明白,什么是类、设备和、类设备和驱动程序?

其中哪一个实际上负责在/proc/ 下创建条目?

【问题讨论】:

  • 忘掉/proc吧,现在的设备都是通过sysfs做广告的。
  • @0andriy 你能推荐一些关于编写设备驱动程序的正确和现代方式的好书吗?

标签: linux-kernel linux-device-driver kernel-module device-driver


【解决方案1】:

而不是进入 什么是类,或 什么是设备(我不是这方面的专家) Linux内核),我将解决这个问题。

创建字符设备后,您希望能够从用户空间访问它。为此,您需要在/dev 下添加一个设备节点。您可以通过两种方式做到这一点。

使用mknod手动添加设备节点(旧)

mknod /dev/<name> c <major> <minor>

使用udev

这就是class_createdevice_createclass_device_create(旧)的用武之地。

要从您的内核模块通知udev,您首先使用创建一个虚拟设备类

struct class * class_create(owner, name)

现在,名称将出现在/sys/class/<name>

然后,创建一个设备并将其注册到 sysfs。

struct device *device_create(struct class *class, struct device *parent, dev_t devt, void *drvdata, const char *fmt, ...)

现在,设备名称将出现在/sys/devices/virtual/<class name>/<device name>/dev/<device name>

不清楚您对 /proc 条目的要求是什么。

在你的模块被加载后,它会出现在/proc/modules 中(做一个cat /proc/modules 来查看它)。并且,在分配设备编号后,使用

int register_chrdev_region(dev_t first, unsigned int count, char *name)

,名称将出现在/proc/devices 中(执行cat /proc/devices 即可查看)。

另外,请检查这些函数的内核源代码,因为它们很好地描述了它们在 cmets 中的作用。

好老的LDD3 没有提供这些机制,但它是一个非常好的来源。

【讨论】:

  • 类名有什么逻辑吗?例如这个:/sys/class/leds/omega2p:amber:system :amber:system 是什么意思?!谢谢
  • @aleXela 我认为您可以为该课程提供任何描述性名称。这里,amber 可能是 LED 颜色,system 可能与 LED 的指定功能相关。我刚刚搜索了一下,发现this。如果你有源码,你可以看看它是如何实现的。
猜你喜欢
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 2010-09-07
  • 2012-07-09
  • 2011-01-18
相关资源
最近更新 更多