第二章 开发环境搭建:从内核到工具链的完整配置
说实话,搭建开发环境这件事,看着琐碎,但却是整个课程的基础。我见过太多人因为环境没配好,后面调试时各种抓狂。今天我就把这一整套流程——从内核源码获取、i915驱动编译,到libdrm、mesa库的安装,再到igt-gpu-tools的使用——完整地过一遍。
2.1 Linux内核源码获取与编译
先搞定内核。我个人习惯用主线内核,因为Intel GPU驱动更新快,主线往往有最新的支持。
2.1.1 获取源码
去kernel.org下载,或者直接用git拉取:
git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
git checkout v6.6 # 选一个稳定版本,我推荐6.x以上
嗯,这里要注意:别用太老的内核。我曾经在4.19上折腾i915的某个新特性,结果发现根本不支持,白白浪费两天时间。
2.1.2 配置与编译
配置内核时,i915驱动相关的选项必须打开:
make x86_64_defconfig
make menuconfig
在menuconfig里,找到以下路径并确保开启:
| 配置项 | 路径 | 说明 |
|---|---|---|
| CONFIG_DRM_I915 | Device Drivers → Graphics support → Intel 8xx/9xx/G3x/G4x/HD Graphics | 核心驱动,必须编译为模块(M)或内置(Y) |
| CONFIG_DRM_I915_CAPTURE_ERROR | 同上子菜单 | 错误捕获,调试时很有用 |
| CONFIG_DRM_I915_GVT | 同上子菜单 | 虚拟化支持,按需开启 |
make localmodconfig 基于当前系统生成配置,再手动补上i915相关项。这样编译快很多。
编译命令很简单:
make -j$(nproc) # 用所有CPU核心并行编译
make modules_install
make install
编译完成后,更新grub并重启:
update-grub
reboot
2.2 Intel GPU驱动(i915)模块加载
重启后,检查i915模块是否加载成功:
lsmod | grep i915
如果没看到输出,手动加载:
modprobe i915
确认加载后,查看驱动信息:
cat /sys/kernel/debug/dri/0/i915_capabilities
这里会显示你的GPU支持哪些特性。比如是否支持Guc、Huc,显示引擎的版本号等。我个人习惯把这个信息保存下来,后面调试时对照着看。
2.3 libdrm与mesa库的编译安装
libdrm是用户态访问DRM(直接渲染管理器)的接口库,mesa则是OpenGL/Vulkan的实现。这两个是上层图形应用的基础。
2.3.1 编译libdrm
从freedesktop.org获取源码:
git clone https://gitlab.freedesktop.org/mesa/drm.git
cd drm
meson build
ninja -C build
sudo ninja -C build install
这里我建议加上intel平台的支持:
meson build -Dintel=enabled
为什么?因为libdrm默认可能不开启intel的API,你后面用intel专用工具时会找不到头文件。我曾经在这上面栽过跟头,编译igt-gpu-tools时提示找不到libdrm_intel.h,折腾了半天才发现是libdrm没配好。
2.3.2 编译mesa
mesa的编译稍微复杂一点,依赖比较多:
git clone https://gitlab.freedesktop.org/mesa/mesa.git
cd mesa
meson build -Dgallium-drivers=iris -Dvulkan-drivers=intel -Ddri-drivers=i965
ninja -C build
sudo ninja -C build install
解释一下这几个选项:
gallium-drivers=iris:Intel的新一代Gallium驱动,支持Gen8及以上GPUvulkan-drivers=intel:Intel Vulkan驱动(ANV)dri-drivers=i965:老一代DRI驱动,兼容旧硬件
关键点: 如果你的GPU是Gen8(Broadwell)之前的,用i965;之后的用iris。我建议两个都编上,反正不冲突。
编译完成后,更新动态链接库缓存:
sudo ldconfig
验证一下:
glxinfo | grep "OpenGL renderer"
如果看到类似 "Intel Iris" 或 "Intel i965" 的字样,说明mesa安装成功。
2.4 硬件调试工具:igt-gpu-tools
igt-gpu-tools是Intel官方提供的GPU测试和调试工具集。说白了,它就是嵌入式图形开发的瑞士军刀。
2.4.1 编译安装
git clone https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
cd igt-gpu-tools
meson build
ninja -C build
sudo ninja -C build install
依赖检查:确保libdrm、libpciaccess、cairo等库已安装。如果编译报错,缺什么装什么就行。
2.4.2 常用工具一览
| 工具名 | 用途 | 我的使用场景 |
|---|---|---|
| intel_gpu_top | 实时查看GPU占用率、频率、带宽 | 排查性能瓶颈时必开 |
| intel_reg | 读写GPU寄存器 | 调试显示时序、时钟频率 |
| intel_framebuffer_dump | 抓取当前帧缓冲区内容 | 验证显示输出是否正确 |
| gem_* 系列 | GEM(图形执行管理器)测试 | 验证内存管理、命令提交 |
| kms_* 系列 | KMS(内核模式设置)测试 | 测试分辨率切换、多屏显示 |
2.4.3 实战:用intel_gpu_top监控GPU
打开终端,运行:
sudo intel_gpu_top
你会看到类似这样的输出:
intel-gpu-top - 0.0/ 0.0 W; 0.0/ 0.0 W; 0.0/ 0.0 W
render busy: 12% RC6: 88%
blitter busy: 0%
video busy: 0%
video enhance: 0%
frequency: 300 MHz (min: 300 MHz, max: 1100 MHz)
这里render busy表示渲染引擎的负载,RC6是空闲状态。如果RC6一直很低,说明GPU没有进入省电模式,可能有问题。
2.4.4 用intel_reg读取寄存器
举个例子,读取PCH(平台控制器集线器)的显示时钟寄存器:
sudo intel_reg read 0xC0000
输出示例:
0xC0000: 0x00000000 (PCH_RAWCLK_FREQ)
这个寄存器存的是原始时钟频率。如果读出来是0,说明时钟没配好,显示可能不正常。
2.5 验证环境是否就绪
最后,跑一个简单的测试,确认整个链路是通的:
sudo igt-gpu-tools/build/tests/kms_flip --run-subtest basic-flip-vs-wf_vblank
这个测试会做一次页面翻转,并检查垂直消隐期(vblank)的时序。如果通过,说明你的内核、驱动、libdrm、mesa全部工作正常。
嗯,到这里,开发环境就搭建好了。整个过程看着步骤多,但只要你按顺序来,一般不会出大问题。下一章我们开始真正接触Intel GPU的显示引擎,从硬件框图讲起。