自动创建节点
在驱动中加入对 udev 的支持(自动创建设备节点)的主要做法是:在驱动初始化的代码里调用 class_create() 为该设备创建一个 class,再为每个设备调用 device_create() 创建对应的设备。
内核中定义的 struct class 结构体,顾名思义,一个 struct class 结构体类型的变量对应一个类,内核同时提供了 class_create() 函数,可以用它来创建一个类(class),这个类(class)存放在 sysfs 下面,一旦创建好了这个类,再调用 device_create() 函数来在 /dev 目录下创建相应的设备节点。
这样,加载模块的时候,用户空间中的 udev 会自动响应 device_create() 函数,去 /sysfs 下寻找对应的类,从而创建设备节点。
register_chrdev(MEM_MAJOR,"mem",&memory_fops) 向内核注册了一个字符设备(不只是注册了设备号,还做了 cdev 的初始化以及 cdev 的注册)。第一个参数为主设备号,0代表动态分配,这里的 MEM_MAJOR 为1;第二个参数是设备的名字;第三个参数为文件操作指针,完成注册后,在 /proc/devices 中第一个字符设备我们就看到了 :/mem。