一、介绍
本文主要介绍设备文件/dev/dri/cardxx、/dev/dri/renderDxx的创建与open内核流程。分析的内核代码版本为linux-5.4.191。
二、创建DRM设备文件
pci probe到GPU设备后,会调用函数devtmpfs_create_node将创建设备文件(或称为设备结点)的请求加入链表,并唤醒内核线程kdevtmpfs,最终创建设备文件由内核线程kdevtmpfs完成,pci probe相关调用流程如下:
pci probe到GPU设备
-》drm_dev_alloc
-》drm_dev_init
-》drm_minor_alloc
-》drm_sysfs_minor_alloc
-》minor_str = "renderD%d";/minor_str = "card%d";
-》kdev->class = drm_class; drm_class->devnode被设置为函数drm_devnode,具体见函数drm_sysfs_init
-》dev_set_name(kdev, minor_str, minor->index);
-》drm_dev_register
-》drm_minor_register
-》device_add
-》devtmpfs_create_node
-》req.name = device_get_devnode 将请求创建的结点名字设置为"dri/renderDxx"或"dri/cardxx"
-》dev->class->devnode 即调用函数drm_devnode,该函数返回字符串"dri/renderDxx"或"dri/cardxx"
-》req.next = requests;
requests = &req; 将创建设备结点请求加入链表
-》wake_up_process 唤醒内核线程kdevtmpfs
内核启动初始化时,会调用函数driver_init->devtmpfs_init,函数devtmpfs_init的相关工作如下:
- 调用vfs_kern_mount mount devtmpfs,根据下面的流程可知,创建的devtmpfs基于shmem,函数shmem_fill_super创建了超级块,且超级块的成员s_root(类型为struct dentry *,指devtmpfs文件系统的根路径的目录项)的inode操作被设置为shmem directory的操作(shmem_dir_inode_operations)。
- 调用kthread_run创建内核线程kdevtmpfs。
static struct file_system_type i