简介

内核中定义了struct class结构体,一个struct class 结构体类型变量对应一个类,内核同时提供了几个函数。

class_create():创建一个类,这个类存放于/sys/class/下面,先创建这个类,再调用device_create();

device_create():在/dev目录下创建相应的设备节点(在/proc/devices/下也可以看到)。

注意:真正创建设备节点的函数是device_add,device_register也调用到了device_add。

创建设备节点函数

一般创建设备节点会用这三个函数:device_create、device_register、device_add。

设置节点名函数

在创建节点以前,一般用dev_set_name函数设置节点名,例如:

  struct device dev;

  dev_set_name(&dev, "mtd%d", mtd_num)

device_create调用过程

(linux-4.9.37):(不同版本内核略有不同)device_create

    device_create_vargs   //对device类中的变量赋值,devt name release等初始化这个结构体中的变量

        device_create_groups_vargs

            device_add

                //创建/dev/目录下的设备节点

                device_create_file(dev, &dev_attr_uevent)

                device_add_class_symlinks(dev)

                device_add_attrs(dev)

                bus_add_device(dev)

                device_pm_add(dev)

                //创建/sys/class/...目录下的属性文件

                device_create_file(dev, &dev_attr_dev)

                device_create_sys_dev_entry(dev)

                kobject_uevent(&dev->kobj, KOBJ_ADD);

                bus_probe_device(dev);

device_register调用过程

(linux-4.9.37):(不同版本内核略有不同)

device_register(struct device *dev)

      device_initialize(dev);

      return device_add(dev);