LWN:NVIDIA 与 nouveau!

article/2025/10/4 5:05:00

关注了就能看到更多这么棒的文章哦~

NVIDIA and nouveau

By Jake Edge
October 5, 2022
LPC
DeepL assisted translation
https://lwn.net/Articles/910343/

英伟达图形加速硬件的源代码发不了,对人们来说这也许是一个惊喜;至少快速浏览下来,这部分代码最终可能可以合入 mainline,称为一个官方支持的驱动程序。多年来,nouveau 项目一直在为 NVIDIA 硬件开发 upstream 的驱动程序,因此引出了一个明显的问题,在 NVIDIA 的这个宣告之后,nouveau 该怎么办。内核图形维护者 Dave Airlie 在 2022 年的 Linux Plumbers 大会(LPC)上发表了演讲,来帮助阐明有关这个问题的一些情况。

NVIDIA

他首先介绍了 NVIDIA 硬件的简要历史,在他的幻灯片中可以看到一条时间线。他说,这条时间线中的一部分是 "从维基百科上拼凑得来的",并不完全准确,但显示了 "英伟达硬件的历史有多长"。他说,虽然时间轴是从 1999 年开始,但在 2006 年 NV50 开始,变得更有趣了。它引入了每个上下文特有的虚拟内存地址;这个功能代表了图形硬件的一个重要转折点。

f06e31d30c67c7cc6ac5a7a1cb708006.png

[Dave Airlie]

从 2010 年的 "Fermi"(GF1xx)开始,英伟达的产品发布大致是按两年的周期。2012 年的"Kepler"(GK1xx)硬件中加入了 Vulkan 支持。2014 年的"Maxwell"有两个版本(GM1xx 和 GM2xx);后者也被称为 "Maxwell 2",其中引入了 signed firmware。这个趋势或多或少地延续到 2016 年的 "Pascal"(GP1xx),2017 年的 "Volta"(GV1xx),2018 年的 "Turing"(TU1xx),以及 2020 年的 "Ampere"(GA1xx)。Turing 中加入了对 GPU system processor(GSP)的支持;他在演讲的稍后部分解释了该功能的重要性。

从 Maxwell 2 开始,英伟达决定,出于安全和其他方面的考虑,其设备固件不能简单地以未签名方式来加载了。因此,固件需要由英伟达进行签名,并加载到设备上的各个处理器中。这给 nouveau 项目带来了困难,因为它需要复杂的启动流程,要按特定的顺序将多个 firmware image 放入设备之内,而这是 "非常难实现的"。

英伟达和 nouveau 最终共同决定了一个流程,那就是英伟达将提供签名过的固件。但是要让所有硬件都能正常工作仍然很困难。哪怕在启动时做了所有正确的步骤,这个设备也还是仅仅提供了基本配置。这些设备已经通电并可以正常运行,但 "你不能调整它的 clock 频率,就无法让它更快运行"。手动选择英伟达设备的性能级别就被称为 "reclocking"。驱动程序中也没有电源管理功能。Airlie 说,这是 nouveau 的一个分水岭,因为对驱动程序投入大量精力之后只能让图形加速硬件运行在最慢模式下,并且对功耗方面也不友好,这没有意义。

GSP 是一个基于 RISC-V 的处理器,是在 Turing 和后来的硬件中添加进来的。GPU 上已经有 "六七个小处理器",但 GSP 则是为了成为 "统治它们的那一个处理器"。GSP 的固件文件约为 30 或 40MB;早期的固件文件大多在 256KB 左右,也就是说 GSP 的 size 有了大幅增加。但它是设备中的唯一固件了,可以初始化其余的处理器。实际上,英伟达将其大部分专有代码的内核驱动转移到了 GSP 中。

他说,这一切都发生在英伟达内核驱动程序开源宣告的同时。这些都是基于一个只跟 GSP 直接交互的英伟达专有驱动程序 fork 出来的;事实证明,内核和 GSP 之间的 API 里没有什么重要的内容,所以可以作为开源发布。由于英伟达有一些客户希望能得到开源驱动程序,所以该公司这样做就有价值了。然而,这些驱动程序的外观和行为,跟现有的内核图形驱动程序不同,所以它们无法进入 upstream 内核,Airlie 说。

nouveau

这就是英伟达世界的现状,这一切都为介绍 nouveau 做了一个很好的引子。此项目始于 2007 年左右,目的是对 NVIDIA GPU 进行逆向工程来创建 Linux 驱动。它支持从 NV04(1999 年)到 Ampere 的硬件,这些硬件 "处于各种失去维护的状态"。

但由于各种因素,该项目最近有一些停滞。一个社区开源图形项目所面临的一个大问题是,一旦有人在这个项目上工作得很好,就会被人知道,他们就会被雇佣而去做其他的图形硬件工作。实际上,只有一个全职的 nouveau 开发人员在这个项目上工作,那就是红帽公司的 Ben Skeggs。

此外,在签名固件出现后,由于它缺乏 reclocking 和电源管理功能,这对我们的项目来说是令人沮丧的;开源驱动程序不可能跟专有驱动程序竞争。很难证明值得在 nouveau 中投入大量精力。除此之外,Skeggs 还花了很多时间试图让 NVIDIA 提供的固件可以正常加载以及在硬件上运行。

大多数情况下,nouveau 的内核驱动目前来说只能实现硬件基本能用。英伟达提供的固件与专有驱动程序所使用的固件并不一样,没有经过完整的测试。只有 NVIDIA 才能真正 debug 该固件中的问题,所以必须与 NVIDIA 工程师进行多次来回的交流。不过最近该项目一直在增加对 GSP 的支持,因为这可以给 reclocking 等功能提供了一个高级的接口,所以希望 nouveau 内核驱动程序能够使用标准的 NVIDIA GSP 固件,并以这种方式来驱动硬件;"我们等着看吧"。

OpenGL and Vulkan

Mesa 中有一个 nouveau OpenGL 驱动。他认为它已经通过了 OpenGL 4.5 的一致性测试,但从未提交认证。直到最近,它还是只有 "糟糕的多线程上下文支持",所以它对老式的单线程游戏等情况是可用的,但对 Firefox 或现代游戏等程序则无法支持;不过,最近已经 fix 了。然而,由于缺乏对硬件的 reclocking 支持,该驱动没有进行很多优化。

最近,在 Karol Herbst 和 Airlie 的帮助下,Jason Ekstrand 为 nouveau 开发了一个 Vulkan 驱动。在演讲的时候,这还是个小新闻,但在那之后事情就有了更多进展。驱动程序的目标是针对从 Kepler 到 Ampere 的硬件的 Vulkan 1.0,目前正在通过了很多一致性测试。但是为了完成该驱动,并使其按照人们预期的方式工作,就需要在内核中添加新的用户空间 API。

他说,要让 Vulkan 真正发挥作用,需要三个功能。第一个是将物理内存分配(用在 buffer object 上)与 GPU 虚拟内存的分配都分开。在 nouveau 中,所有这些都是一步完成的,这对 OpenGL 来说是很好的,但对 Vulkan 来说是不可行的,因为它需要对 mapping 进行更多的控制。

第二,需要支持 synchronization object 已经相关的处理,以便调度器可以在发送新任务之前等待现有的 GPU 工作完成。这是对 GPU 工作进行适当的交错执行的方式,Airlie 说。最后一部分是一个叫做 VM_BIND 的虚拟内存处理接口;这是英特尔驱动中正在研究的东西,而 amdgpu 驱动已经有了它的许多部件。这是一个用于虚拟内存和命令提交(command submission)的 API,也是为了满足 Vulkan 的需求。

他说,这些都是不少工作量。在 GSP 支持就位,并且可以进行 reclocking 之后,这些工作就是 nouveau 的下一步目标了,但确实需要一些时间。Vulkan 驱动开发者已经开始关注这项工作,但有些循环依赖,使人很难看出是如何循序渐进地进行这项工作的。这将会有大量代码需要 review,所以要想采用零散合入的方式将其纳入 upstream 内核将会是一个挑战。

Future

他说,有一些即将到来的问题还没有正面去处理。比如 30 或 40MB 的固件镜像是相当大的;通常情况下,这些镜像被放到 initramfs 中。但把多个 initramfs 镜像放入启动分区就可能会超出可用空间。因为缺乏固定的固件 ABI,所以问题变得更严重,有可能需要包含多个 NVIDIA 固件镜像文件。nouveau 项目将不得不选择支持哪几个版本的固件,并且让每个版本都必须可用;他曾想过是否有办法将固件加载推迟到真正 mount 了根文件系统之后,但目前还没有真正解决这个问题。

从长远来看,将英伟达的固件 API 加入到 nouveau 驱动中可能并没有什么意义,因为 nouveau 驱动对一切工作都有自己的想法。可能需要抛开现有的 nouveau 传统做法,实现一个新的驱动程序,只使用 NVIDIA 的 API 跟 GSP 交互,这可能会是正确的途径。此外,reclocking 硬件以及加速 GPU 的能力可能可以允许创建一个跨平台的 compute stack,来取代目前已经存在的由特定供应商提供的解决方案(如 CUDA)。所有这些解决方案都在自己的孤岛之上,缺乏真正的开发者社区,但也许这可以改变;"我们已经为 Vulkan 做了,我们已经为 OpenGL 做了,我不明白我们有什么理由不继续这样做",尽管这将需要大量的时间,以及可能需要大量资金。

一位听众问及 Vulkan Compute 是否可行,但 Airlie 说它并不是针对 CUDA 和类似软件同类的问题的。它比 OpenGL Compute 要好,但离真正的 compute stack 还有一段距离。Ekstrand 对此表示赞同,他指出,虽然人们希望看到 Vulkan Compute 处理更多的 "科学" 计算的场景,但它永远不会成为一个全栈的解决方案;他说,Vulkan 最多只能提供 run-time 部分。

大家对 Airlie 所描述的 GSP 固件和 initramfs 的大小问题进行了一些讨论,包括给出了若干个解决这个问题的方法。希望了解该讨论或讲座中其他细节的人,可以在 YouTube 上查看该讲座的视频。

[编者感谢 LWN 的用户支持我去都柏林参加 Linux Plumbers 会议]。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

format,png


http://chatgpt.dhexx.cn/article/fp0QO3j5.shtml

相关文章

干掉Nouveau安装Linux Nvidia显卡驱动

干掉Nouveau安装Linux Nvidia显卡驱动 首先说明下什么是Nouveau,为什么有些系统安装N卡驱动的时候会提示“ERROR: The Nouveau kernel driver is currently in use by your system. This driver is incompatible with the NVIDIA driver……”之类的错误。 Nouvea…

centos7篇---禁用默认的驱动nouveau,安装cuda和cudnn

禁用默认的驱动nouveau,安装cuda和cudnn 硬件设施:1. 禁用默认的驱动nouveau2. 系统要求3. 软件更新4. 安装驱动5. 安装cuda6. 安装cudnn参考 硬件设施: centos7 NVidia显卡驱动:470.57 CUDA: 11.4.2 cuDNN: 8.2.4 1. 禁用默认…

ubuntu系统禁用自带Nouveau驱动

Nouveau是由第三方为NVIDIA显卡开发的一个开源3D驱动,让Linux更容易的应对各种复杂的NVIDIA显卡环境,安装完Linux系统即可进入桌面并且有不错的显示效果,所以,很多Linux发行版默认集成了Nouveau驱动,在使用NVIDIA显卡时…

Ubuntu20.04 系统禁用自带的Nouveau驱动

注:该博文所述的方法同样适用于Ubuntu16.04、Ubuntu18.04版本系统。 nouveau(英语:/nuːˈvoʊ/) 是一个自由开放源代码GPU驱动程序,是为Nvidia的GPU所编写,也可用于属于系统芯片的高通系列,此驱动程序是由一群独立的…

400错误

400 请求出错 由于语法格式有误,服务器无法理解此请求。不作修改,客户程序就无法重复此请求。 原因: 1、前端提交数据的字段名称或者是字段类型和后台的实体类不一致,导致无法封装; 2、前端提交的到后台的数据应该是…

springboot访问400错误,记录一下

1.界面显示 spring boot启动,ip加端口会默认访问index.html页面。浏览器中输入,显示如上。开始以为是没有新建index.html页面的原因。所以我就在templates下面新建了index.html页面,重启,再访问。发现还是显示如上。后来查找资料…

接口报400错误解析

原文地址: https://blog.csdn.net/lw1242189467/article/details/80048407 首先,遇到400问题,最大几率是出现了数据类型不一致的问题,简单来说是Controller层不用正确读取你发送请求附带的参数。该例是我前端传送JSON格式&#x…

tomcat自定义400错误页面

原文链接&#xff1a;https://aspiresoftware.in/blog/catalinatomcat-custom-error-report-valve-to-handle-errors-exceptions/ <Valve className"org.apache.catalina.valves.ErrorReportValve" showReport"false" showServerInfo"false" …

java 400_Java项目报400错误的原因与解决方法

java项目中400错误介绍&#xff1a;(推荐&#xff1a;java视频教程) 400 Bad Request&#xff1a; 请求中的语法错误。Reason-Phrase应当标志这个详细的语法错误&#xff0c;比如”Missing Call-ID header field”。 HTTP 400 错误 - 请求无效 (Bad request) 在ajax请求后台数据…

uniapp:request 请求出现400错误

uniapp&#xff1a;request 请求出现400错误 开发需求&#xff1a;我们团队在使用 uniapp springboot 开发微信小程序项目&#xff0c;前端向后端发送request 请求时&#xff0c;前端爆出400错误。 400错误&#xff1a; 请求无效 (Bad request);出现这个请求无效报错说明请求没…

服务器返回400错误

运维的项目&#xff0c;莫名其妙的有些接口报了400错误&#xff0c;和前端一起检查了传参格式、传参实体类是否一一对应等&#xff0c;因为入参有中文&#xff0c;顺带把编码格式也查了&#xff0c;但都没问题&#xff0c;而且最神奇的是&#xff0c;正式服该接口就报400错误&a…

JAVA400错误_程序访问一个地址时候报400错误,浏览器访问正常怎么解决

最近凯哥在调程序的时候&#xff0c;发现以前好好的程序&#xff0c;突然不能用了。于是就本地断点&#xff0c;发现了如下错误&#xff1a; 程序通过httpClient访问一个地址的时候&#xff0c;提示&#xff1a;server returned HTTP Response code &#xff1a;400 fro URL:XX…

tomcat 400错误

本片文章是对tomcat 400 错误造成信息泄露&#xff0c;如何进行修复进行描述&#xff0c;希望可以对非安全专业的互联网工作人员提供一点帮助&#xff0c;本片文章内容确实也是笔者最近遇到的一些问题。 漏洞描述 tomcat 发生400 错误&#xff0c;暴露出中间件版本、以及程序…

html400错误,http400错误如何解决

还有不少小伙伴们都碰到了http400错误如何解决这个疑惑吧&#xff0c;那么究竟该怎样解决呢&#xff1f;不妨就让iefans网小编告诉大家处理http400错误方法讲解&#xff0c;希望能够帮助到各位解决这个问题。 方法/步骤分享&#xff1a; 一、前端ajax请求&#xff0c;修改需要使…

接口400错误解析

今天我遇上一个让我很痛心的错误400。对程序员来说&#xff0c;这可能是一个最简单的错误码。因为这个相应并没有进拦截器&#xff0c;更没有进到Controller层。可我在解决这个问题时&#xff0c;质询了很多朋友不解&#xff0c;百度各种方案无效。苦苦耗费我大半天时间。 首先…

400错误请求怎么解决_什么是400错误请求错误(以及如何解决)?

400错误请求怎么解决 A 400 Bad Request Error occurs when a request sent to the website server is incorrect or corrupt, and the server receiving the request can’t understand it. Occasionally, the problem is on the website itself, and there’s not much you c…

HTTP 400错误

HTTP 400错误&#xff1a; 400 是 HTTP 的状态码&#xff0c;主要有两种形式&#xff1a; 1、bad request 意思是 “错误的请求”&#xff1b;2、invalid hostname 意思是 “不存在的域名”。 400 Bad Request 是由于明显的客户端错误&#xff08;例如&#xff0c;格式错误的…

rapidjson安装学习

这里主要记录几个要点&#xff0c;后面来补充吧&#xff0c;很晚了 源码是鹅厂大佬写的&#xff0c;佩服佩服~ 一、RapidJSON介绍及资料 RapidJSON是腾讯开源的C JSON解析及生成器&#xff0c;只有头文件的C库&#xff0c;跨平台。 RapidJSON 是一个 C 的 JSON 解析器及生成器…

rapidjson安装使用

前言&#xff1a;仅个人小记。 正文 由于 rapidjson是 “header-only”的C库&#xff0c;故而直接将头文件目录拷贝到系统目录或者指定目录即可完成安装。 参考材料&#xff1a; rapidjson代码仓库 https://github.com/Tencent/rapidjson rapidjson 文档 https://rapidjson.…

rapidjson创建json字符串

参考链接&#xff1a;http://rapidjson.org/zh-cn/ #include "json/stringbuffer.h" #include "json/prettywriter.h"void getJson() {rapidjson::StringBuffer buf;rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buf);writer.StartObj…