字符设备驱动
graph LR A[字符设备驱动框架]-->B1[驱动初始化] B1[驱动初始化]-->C1[分配设备号] C1[分配设备号]-->D1[静态分配设备号] D1[静态分配设备号]-->E(register_chrdev_region) C1[分配设备号]-->D2[动态分配设备号] D2[动态分配设备号]-->F(alloc_chrdev_region) C1[分配设备号]-->D3[操作设备号dev_t] D3[操作设备号dev_t]-->Z1(MAJOR提取主设备号) D3[操作设备号dev_t]-->Z2(MINOR提取主设备号) D3[操作设备号dev_t]-->Z3(MKDRV将主次设备号合成dev_t) D3[操作设备号dev_t]-->Z4(cat /proc/device/xxx查看设备号) B1[驱动初始化]-->C2[初始化cdev] C2[初始化cdev]-->G(cdev_init) B1[驱动初始化]-->C3[注册cdev] C3[注册cdev]-->H(cdev_add) A[字符设备驱动框架]-->B2[构建file_operations] B2[构建file_operations]-->J1(open) B2[构建file_operations]-->J2(read) J2(read)-->K(copy_to_user) B2[构建file_operations]-->J3(write) J3(write)-->L(copy_from_user) B2[构建file_operations]-->J4(ioctl) J4(ioctl)-->M(copy_from_user/copy_to_user) B2[构建file_operations]-->J5(close) A[字符设备驱动框架]-->B3[生成设备节点] B3[生成设备节点]-->N1[手动生成设备节点] N1[手动生成设备节点]-->O(mknod命令) B3[生成设备节点]-->N2[自动生成设备节点] N2[自动生成设备节点]-->M1(class_create:在/sys/class/目录下创建一个class) N2[自动生成设备节点]-->M2(device_create:在/dev/目录下创建一个device) A[字符设备驱动框架]-->B4[驱动卸载] B4[驱动卸载]-->P1[释放设备号] P1[释放设备号]-->Q(unregister_chrdev_region) B4[驱动卸载]-->P2[卸载cdev] P2[卸载cdev]-->R(cdev_del) B4[驱动卸载]-->P3[卸载设备] P3[卸载设备]-->T(device_destory)
杂项设备驱动
graph LR A[杂项设备驱动框架]-->B1[注册杂项设备] B1[注册杂项设备]-->C(misc_register) A[杂项设备驱动框架]-->B2[构建杂项设备结构体] B2[构建杂项设备结构体]-->D(struct miscdevice:对次设备号/设备节点名称/file_operations初始化) A[杂项设备驱动框架]-->B3[构建file_operations] B3[构建file_operations]-->J1(open) B3[构建file_operations]-->J2(read) J2(read)-->K(copy_to_user) B3[构建file_operations]-->J3(write) J3(write)-->L(copy_from_user) B3[构建file_operations]-->J4(ioctl) J4(ioctl)-->M(copy_from_user/copy_to_user) B3[构建file_operations]-->J5(close) A[杂项设备驱动框架]-->B4[卸载杂项设备] B4[卸载杂项设备]-->E(misc_deregister)
应用层打开节点
graph LR A[应用程序]-->B1[open] B1-->C[file_operations] A[应用程序]-->B2[read] B2-->C[file_operations] A[应用程序]-->B3[write] B3-->C[file_operations] A[应用程序]-->B4[ioctl] B4-->C[file_operations] A[应用程序]-->B5[close] B5-->C[file_operations] C-->D1[内核注册的open] C-->D2[内核注册的read] C-->D3[内核注册的write] C-->D4[内核注册的ioctl] C-->D5[内核注册的close] D1-->E[操作硬件] D2-->E[操作硬件] D3-->E[操作硬件] D4-->E[操作硬件] D5-->E[操作硬件]