mknod:手动创建设备节点的命令devfs:自动创建设备节点的机制,创建设备节点的逻辑在内核(2.4 版本之前使用)udev:自动创建设备节点的机制,创建设备节点的逻辑在用户空间(使用至今)mdev:轻量级 udev 机制,用于一些嵌入式设备 /sys/class/<dir>/<file>
hotplug ─────────────► udev ──────► /dev/<file>
▲ 用户层
───┼──────────────────────────────────────────────────
│ 发起 hotplug event
┌──┼──────────────────────────────────┐ 内核层
│ │ Driver │
│ ▲ 1. submit struct class │
│ │ 2. submit struct device │
└──┼──────────────────────────────────┘
│ 硬件信息加载到内核中
────┼──────────────────────────────────────────────────
│ 硬件层
当硬件接入的时候,驱动向 udev 的守护进程 systmd-udevd 发起热插拔事件,将结构体提交,系统会在 /sys/class 下创建对应的文件,udev 会自动依据新的文件来创建 /dev 下的设备文件。如此一来,不需要我们手动去使用 mknod 来创建设备文件了。
#include <linux/device.h>
struct class *class_create(struct module *owner, const char *name)
功能:向上提交目录,在内核创建一个 struct class 类型的空间并初始化
参数:
owner:模块指针,填写 THIS_MODULE(宏定义,指向当前模块自身的一个指针)name:向上提交的目录名返回值:成功返回创建好的 struct class 类型的指针,失败返回错误码指针
在 3-4G 的内核区域,最顶层预留了 4K 的空间,class_create 函数指向失败返回值对应的指针是指向这 4K 预留空间的。
bool IS_ERR(const void *ptr) //(unsigned long)(void *)(x) >= (unsigned long)-MAX_ERRNO
功能:用于判断指针是不是指向内核顶层预留的 4K 空间