我遵循了一些解释如何编写 Linux 内核模块的教程,但我有点困惑。即使阅读了官方“文档”,我对这些概念的理解也很差。
创建字符设备(
register_chrdev
)后,我发现使用以下函数的组合是很常见的:
class_create
class_device_create
device_create
我无法理解,什么是
class
,device
和,class device
和司机?
其中哪一个实际负责在
/proc/
下创建条目?
而不是进入什么是类,或什么是设备(我不是 Linux 内核方面的专家),我将按如下方式解决这个问题。
创建字符设备后,您希望能够从用户空间访问它。为此,您需要在
/dev
下添加一个设备节点。您可以通过两种方式做到这一点。
使用
mknod
手动添加设备节点(旧)
mknod /dev/<name> c <major> <minor>
或
使用
udev
这就是 class_create 和 device_create 或 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不提供这些机制,但它是一个非常好的来源。