linux内核中的drm_dev_alloc()会创建设备节点吗?如果会,那具体的调用流程是怎样的?
drm_dev_alloc()
是 Linux 内核中的一个函数,用于分配和初始化一个 DRM(Direct Rendering Manager) 设备结构体。这个函数本身并不会直接创建设备节点(device node),但它是创建设备节点的一个步骤。
设备节点的创建通常涉及多个步骤和函数调用。以下是一个简化的流程,描述了从 drm_dev_alloc()
到设备节点创建的过程:
分配和初始化 DRM 设备结构体:
drm_dev_alloc()
分配和初始化 drm_device
结构体。struct drm_device *drm_dev_alloc(struct drm_driver *driver, struct device *parent);
注册 DRM 设备:
drm_dev_register()
注册 DRM 设备。这个函数会将设备添加到 DRM 子系统中,并进行一些必要的初始化。int drm_dev_register(struct drm_device *dev, unsigned long flags);
创建设备节点:
drm_dev_register()
内部,会调用 drm_minor_register()
来注册次设备(minor device),这一步会创建设备节点。int drm_minor_register(struct drm_device *dev, unsigned int type);
创建设备文件:
drm_minor_register()
会调用 device_create()
来创建设备文件(device file),这一步会在 /dev
目录下创建设备节点。struct device *device_create(struct class *class, struct device *parent,
dev_t devt, void *drvdata, const char *fmt, ...);
以下是一个简化的调用流程图:
drm_dev_alloc()
|
v
drm_dev_register()
|
v
drm_minor_register()
|
v
device_create()
以下是一些关键代码片段,展示了上述流程:
drm_dev_alloc():
struct drm_device *drm_dev_alloc(struct drm_driver *driver, struct device *parent) {
struct drm_device *dev;
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
if (!dev)
return NULL;
dev->driver = driver;
dev->dev = parent;
return dev;
}
drm_dev_register():
int drm_dev_register(struct drm_device *dev, unsigned long flags) {
int ret;
ret = drm_minor_register(dev, DRM_MINOR_PRIMARY);
if (ret)
return ret;
return 0;
}
drm_minor_register():
int drm_minor_register(struct drm_device *dev, unsigned int type) {
struct drm_minor *minor;
int ret;
minor = kzalloc(sizeof(*minor), GFP_KERNEL);
if (!minor)
return -ENOMEM;
minor->dev = dev;
minor->type = type;
ret = device_create(drm_class, dev->dev, MKDEV(DRM_MAJOR, minor->index),
minor, "dri/%d", minor->index);
if (ret)
kfree(minor);
return ret;
}
通过这些步骤,drm_dev_alloc()
分配的设备结构体最终会通过一系列函数调用创建设备节点。