1. 创建设备节点的机制

2. 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 来创建设备文件了。

3. 自动创建设备节点相关的 API

3.1 创建类型

#include <linux/device.h>
struct class *class_create(struct module *owner, const char *name)

功能:向上提交目录,在内核创建一个 struct class 类型的空间并初始化

参数:

返回值:成功返回创建好的 struct class 类型的指针,失败返回错误码指针

3.2 错误码指针

在 3-4G 的内核区域,最顶层预留了 4K 的空间,class_create 函数指向失败返回值对应的指针是指向这 4K 预留空间的。

bool IS_ERR(const void *ptr) //(unsigned long)(void *)(x) >= (unsigned long)-MAX_ERRNO

功能:用于判断指针是不是指向内核顶层预留的 4K 空间