2022年5月,社区终于等到了这一天,NVIDIA开源了他们的LINUX GPU 内核驱动, Linux 内核总设计师 Linus Torvalds 十年前说过的一句话,大概意思是英伟达是LINUX开发者遇到的硬件厂商中最麻烦的一个,说完这句话之后,祖师爷毫不客气的朝着镜头竖了中指并表达了对NVIDIA身体某部的亲切问候。关于祖师爷和NVIDIA那点恩怨咱不清楚,也没啥兴趣,不过单纯看开源这个行为还是喜闻乐见的。下面基于NVIDIA GPU驱动的开源代码在UBUNTU系统上建立编译和开发环境。
平台环境
PC装有NVIDIA GForce MX250显卡,是低端入门级的,不过用来跑跑CUDA,编译内核是足够了。
开源驱动下载
代码托管在github上,连接为:
https://github.com/NVIDIA/open-gpu-kernel-modules.git
查看提交记录发现,驱动是从515.43.04版本开始开源,当前最新的版本为525.85.12.
编译
执行命令
make -j8
进行编译
编译结果为:
./kernel-open/nvidia-uvm.ko
./kernel-open/nvidia-drm.ko
./kernel-open/nvidia.ko
./kernel-open/nvidia-peermem.ko
./kernel-open/nvidia-modeset.ko
安装
执行如下命令进行安装
sudo insmod nvidia.ko
提示检测不到设备,开始不得其解,后面查阅开源仓库的README,才发现MX250GPU不再支持列表,所以也就没有办法使用自己编译的NVIDIA内核驱动驱动GPU了。
LICENSE
查看代码中的LICENSE声明,发现开源代码使用双 GPL/MIT 许可。
而这个许可,是可以通过内核GPL兼容性检查的,不会污染内核。
NVIDIA GPU 公版内核
虽然开源仓库的代码不支持MX250,UBUNTU系统安装后,在/usr/src目录下,存在另一个GPU显卡驱动目录,以我当前的环境为例,它是/usr/src/nvidia-525.78.01/
编译方法有两种:
-
在目录下直接 make,结果产生和上面一样的几个KO文件。
-
通过dkms编译:
$ sudo dkms build -m nvidia -v 525.78.01
$ sudo dkms install -m nvidia -v 525.78.01
安装驱动,可以看到,UBUNTU系统自带的NVIDIA驱动源码编译出来的KO是可以正常加载的,加载nvidia.ko后,系统中出现了/dev/nvidia和/dev/nvidiactl两个节点。
安装nvidia-uvm.ko后,系统中又出现了两个新的节点/dev/nvidia-uvm-tools和/dev/nvidia-uvm
由于依赖关系,下一步需要首先安装nvidia-modeset.ko,否则,直接安装其它两个模块会报错,KMS没有产生新的设备节点。
nvidia-drm.ko貌似也没有创建新的设备节点
开源策略
至于为何存在两套发布方式目前还不得而知。但是经过分析,发现UBUNTU系统自带的代码并非完全开源,协议也非上面使用的双GPL/MIT。
并且存在两个闭源二进制库文件,后缀名为.o_binary的nv-kernel.o_binary和nv-modeset-kernel.o_binary
KMS:
编译时的连接过程
.o_binary中的符号甚至都进行了加密
并且安装KO后,/sys/module/nvidia/taint文件内容为POE,表示内核受到了非GPL协议的代码的污染。
A kernel problem occurred, but your kernel has been tainted (flags:POE). Explanation:
P - Proprietary module has been loaded.
O - Out-of-tree module has been loaded.
E - Unsigned module has been loaded.
Kernel maintainers are unable to diagnose tainted reports. Tainted modules: nvidia_drm,nvidia_modeset,nvidia_uvm,nvidia,vboxne tadp,vboxnetflt,vboxdrv.
所以这样看起来,UBUNTU自带的驱动是闭源无疑的了,不符合开源协议。
另一些发现
后面查看开源代码的构建文件Makefile发现,关于.o_bianry的产生过程也存在于开源代码中,并且开源代码也可以产生.o_binary文件:
make kernel-open/nvidia/nv-kernel.o_binary
所以这样来看,在UBUNTU系统中没有开源的内容,在开源仓库中是能找到对应代码的,并且UBUNTU自带的驱动版本号为525.78.01,和开源仓库最新版非常接近。所以如果纠着闭源的部分不放可能有些吹毛求疵了,毕竟人家在开源仓库中是有开源的。除了部分显卡不支持外,开源仓库的代码没有什么毛病。
驱动源码分析
驱动中的名词解释
名词 |
意义 |
名词 |
意义 |
NOVC |
NVIDIA Object Compiler |
SM |
Streaming Multi-processor |
GR |
Graphics Engine( 叫GR应该是为了避免和二维图形卡GE冲突) |
SMC |
Simultaneous Multiple Contexts |
GSP |
GPU System Processor |
TDR |
Timeout Detection and Recovery |
RM |
Resource Manager |
UID |
User Identifier. |
RC |
Robust Channel(error recovery) |
NVDLA |
NVIDIA Deep-Learning Accelerator |
RMAPI |
Interface between RM and KMD/UMD文章来源:https://www.toymoban.com/news/detail-567163.html |
||
SLI文章来源地址https://www.toymoban.com/news/detail-567163.html |
到了这里,关于几种开源GPU驱动(NV/AMD/Intel)编译&架构分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!