class 和 class 设备的用途是什么?
What is the purpose of class and class device?
我遵循了一些解释如何编写 Linux 内核模块的教程,但我有点困惑。即使读完official "documentation",我对概念的理解也很差。
创建字符设备(register_chrdev
)后,我发现通常使用以下函数的组合:
class_create
class_device_create
device_create
我无法理解什么是 class 设备以及 class 设备和驱动程序?
其中哪一个实际负责在 /proc/
下创建条目?
而不是进入 什么是 class 或 什么是device(我不是Linux内核专家),我将按如下方式解决问题。
创建字符设备后,您希望能够从用户space 访问它。为此,您需要在 /dev
下添加一个设备节点。您可以通过两种方式执行此操作。
使用mknod
手动添加设备节点(旧)
mknod /dev/<name> c <major> <minor>
或
使用udev
这是 class_create and device_create or class_device_create(旧)进来的地方。
要从您的内核模块通知 udev
,您首先使用
创建一个虚拟设备 class
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
就可以看到)。
另外,请检查这些函数的内核源代码,因为它们在评论中很好地描述了它们的作用。
旧的 LDD3 不提供这些机制,但它是一个很好的来源。
我遵循了一些解释如何编写 Linux 内核模块的教程,但我有点困惑。即使读完official "documentation",我对概念的理解也很差。
创建字符设备(register_chrdev
)后,我发现通常使用以下函数的组合:
class_create
class_device_create
device_create
我无法理解什么是 class 设备以及 class 设备和驱动程序?
其中哪一个实际负责在 /proc/
下创建条目?
而不是进入 什么是 class 或 什么是device(我不是Linux内核专家),我将按如下方式解决问题。
创建字符设备后,您希望能够从用户space 访问它。为此,您需要在 /dev
下添加一个设备节点。您可以通过两种方式执行此操作。
使用mknod
手动添加设备节点(旧)
mknod /dev/<name> c <major> <minor>
或
使用udev
这是 class_create and device_create or class_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
就可以看到)。
另外,请检查这些函数的内核源代码,因为它们在评论中很好地描述了它们的作用。
旧的 LDD3 不提供这些机制,但它是一个很好的来源。