3. 创建DRM设备节点

任务说明

本案例目标是在Linux系统中确认DRM设备节点/dev/dri/card0被正确创建,并验证用户空间程序可以正常访问该节点。DRM(Direct Rendering Manager)是Linux内核中负责图形显示和GPU管理的子系统,设备节点由内核在驱动加载时自动创建。本案例将指导你完成节点存在性检查、权限确认以及通过用户空间程序进行基本访问验证。

环境要求

  • Linux系统(内核已启用DRM支持,常见发行版默认开启)
  • 系统具备任一DRM驱动(如i915、amdgpu、nouveau等)
  • 具备root权限或具有video组权限的用户
  • GCC编译器和libdrm开发库(用于用户空间验证程序)

检查设备节点创建

首先确认内核已识别DRM设备并创建了节点:

ls -l /dev/dri/
# 预期输出包含 card0 和 renderD128(或类似名称)
# crw-rw---- 1 root video 226,   0 ... card0
# crw-rw---- 1 root video 226, 128 ... renderD128

如果/dev/dri目录不存在或为空,说明DRM驱动未加载或设备未识别。可通过dmesg | grep drm查看内核日志确认驱动加载状态。

用户空间访问验证程序

编写以下C程序验证用户空间可以打开并查询DRM设备节点:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <xf86drm.h>

int main(void) {
    int fd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC);
    if (fd < 0) {
        perror("open /dev/dri/card0");
        return 1;
    }

    drmVersionPtr version = drmGetVersion(fd);
    if (!version) {
        perror("drmGetVersion");
        close(fd);
        return 1;
    }

    printf("DRM driver: %s\n", version->name);
    printf("Driver version: %d.%d.%d\n",
           version->version_major,
           version->version_minor,
           version->version_patchlevel);
    printf("Kernel module: %s\n", version->desc);

    drmFreeVersion(version);
    close(fd);
    return 0;
}

编译与运行

# 安装libdrm开发库(Debian/Ubuntu)
sudo apt install libdrm-dev

# 编译
gcc -o drm_check drm_check.c -ldrm

# 运行(需具有/dev/dri/card0的读写权限)
./drm_check

验证方法与判定标准

通过以下条件判定案例成功:

  1. /dev/dri/card0节点存在,且权限为crw-rw----,属主为root:video。
  2. 编译后的程序能成功打开节点并打印出DRM驱动名称和版本信息,无错误输出。
  3. 如果当前用户不在video组中,运行程序会返回Permission denied,此时需执行sudo usermod -aG video $USER并重新登录,或使用sudo ./drm_check验证。

程序输出示例(具体内容取决于GPU型号):

DRM driver: i915
Driver version: 1.6.0
Kernel module: Intel Graphics

注意:以上为预期输出示例,实际输出由系统GPU决定。只要程序能成功打印驱动信息且退出码为0,即表示用户空间可正常访问DRM设备节点。