linux-kernel - 类和类设备的目的是什么?

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

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

创建字符设备( register_chrdev )后,我发现使用以下功能的组合很常见:
class_createclass_device_createdevice_create
我无法理解,什么是类、设备和类设备和驱动程序?

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

最佳答案

而不是进入什么是类 , 或 什么是设备 (我不是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 来查看)。

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

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

关于linux-kernel - 类和类设备的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48832742/

相关文章:

linux - 从内核中断读取设备

c - 内核的 "container_of"- 有什么方法可以使其符合 ISO 标准吗?

memory-management - 如何使用 mmap 在用户空间和内核之间共享内存并且数据不受文件支持

Linux 内核 : how to get 'struct file' pointer inside kernel for a device file?

linux-kernel - linux内核如何从设备树中获取数据?

Linux内核——通过模块动态添加系统调用

linux-kernel - strcmp 内核模块内部崩溃

android - usb_buffer_free 和 usb_buffer_alloc 的编译错误

linux - 在没有编译器的 Ubuntu 机器上安装 dkms

debugging - 是否可以使用gdb和qemu同时调试linux用户空间程序和内核空间?