内核之观察i915"/>
使用GDK7调试Linux内核之观察i915
1. i915与DRM的介绍
1.1 i915
i915可以分成两类;一类是内核态空间下的i915,另一类是用户态空间下的i915。
- 内核态空间下的i915是英特尔显卡的内核驱动程序。用户态空间下的i915是基于英特尔显卡的mesa实现的。
- mesa是基于开源的OpenGL实现的。
1.2 DRM
DRM的全称是Direct Rendering Manager,它是Linux内核中的子系统;DRM用于将用户态空间下的进程与GPU进行连接。
- 用户态空间下的进程通过DRM给出API与GPU进行通信,用户态下的进程可以通过该API发送命令及数据给GPU、命令GPU做3D渲染的硬件加速及GPU计算等工作。
- DRM首先是作为X server内核态空间中的组件,但也可以被其他图形堆栈使用。
2. 调试的准备工作
2.1 中断Ubuntu系统的GDK7
参见文章。
2.2. 符号文件的确认
参考文章。
2.3. 符号文件及内核源代码的加载
参考文章。
l 需要加载的内核模块符号文件:i915.ko。
3. 观察i915
1. 在命令行内输入lm l,确认需要的符号文件已经加载,如图3.1所示。
图3.1 确认需要的符号文件已经加载
2. 在命令行内输入x i915!*flush_render,查看函数flush_render的信息,如图3.2所示。
图3.2 查看函数flush_render的信息
3. 在命令行内输入bp ffffffff`c07b16b0,给函数flush_render设置断点,如图3.3所示。
图3.3 给函数flush_render设置断点
4. 恢复GDK7,等待断点命中,断点命中后会自动打开函数所在文件,如图3.4所示。
图3.4 命中断点ffffffff`c07b16b0
5. 在命令行内输入lm l,查看已经加载的模块,如图3.5所示。
图3.5 查看已经加载的模块
6. 在命令行内输入k L,查看堆栈,同时发现DRM模块已经自动载入,如图3.6所示。
图3.6 查看堆栈并发现drm模块自动载入
7. 在命令行内输入dv,查看变量,如图3.7 所示。
图3.7 查看变量
8. 在命令行内输入dc及ddp,查看内存及被引用的内存,如图3.8所示。
图3.8 查看内存及被引用的内存
9. 开始单步调试,观察内存地址的变化及汇编指令的信息,当单步调试执行到i915!gen8_emit_flush_render+0x10处时,文件i915_drv.h自动打开,如图3.9所示。
图3.9 文件i915_drv.h自动打开
10. 在命令行内输入dc及ddp,查看内存及被引用的内存,如图3.10所示。
图3.10 查看内存及被引用的内存
11. 在命令行内输入dv,查看变量,发现变量mode的数值从1变到了2,如图3.11所示。
图3.11 变量mode数值改变
其他说明
若您有问题咨询及出现链接失效等其他情况请联系邮箱:birdring_001@outlook。
更多推荐
使用GDK7调试Linux内核之观察i915
发布评论