当前位置:首页 >> 中药养生 >> M1 GPU 的神话:编写自己的操作系统驱动程序

M1 GPU 的神话:编写自己的操作系统驱动程序

发布时间:2023-04-29

MU(行政工作模式与 CPU MMU 或 IOMMU 相同),然后由呼叫Intel确实上获取朝向其他用户自由空间呼叫默认的常量(多半存储在某种寄存装置或环形默认内)。因此,客户端涡轮客户端除了行政CPU和亦需 GPU 的行政工作外,确实即可督导的行政工作不一定多, Linux 客户端 DRM(Direct Rendering Manager,确实上贴图行政装置)的系统对已经包括了大量期盼客户端,因此汇编涡轮客户端更加容易。虽然有一些十分困难的疑虑,比如守住,但这些疑虑对 GPU 在新的涡轮客户端之中正常行政工作的严重影响不一定大。但 M1 GPU 多种不同……就像 M1 ROM的其他外一样,GPU 有一个名叫“ASC”的协Intel,督导数据处理新产品客户端并行政 GPU。这个协Intel是一个完备的 ARM64 CPU,数据处理了一个名叫 RTKit 的新产品专有实时应用客户端,由它督导处理方式一切,比如主机板行政、呼叫调度和守住、过热完全恢复,乃至机动性统总和据装置、统总和据图表以及温度精确测量等等。两件事实上,macOS 客户端涡轮客户端究竟不与 GPU 应用程序无线电通信。所有与 GPU 的无线电通信都是通过客户端展开的,应用于协作CPU之中的图表构造来传达呼叫。而且这样的构造还有很多,比如:● 初始解构图表:用于配备客户端之中的主机板行政特设以及其他 GPU 一个系统对配备图表,还有数颜色自由空间匹配表,状况不明。这些图表构造有超过1000个数组,我们至今仍未全部弄清楚其具体的发挥作用。● 送交管道:用于处理方式 GPU 配备文件的环形默认。● 装置材操纵最新消息:用于操纵一个系统对的 GPU 操作。● 两件血案最新消息:客户端在发生某些情况(如呼叫顺利完成或失败)时发回涡轮客户端的最新消息。● 统总和据图表、客户端摘要和唯踪最新消息:用于收集 GPU 的情况下图表和数据处理。● 呼叫配备文件:应用客户端的待处理方式 GPU 行政工作列出新。● 默认图表、统总和据图表和页面列出新构造:用于行政平铺四边形默认。● 上下文构造以及其他小部件:历史记录 GPU 客户端的数据处理。● 四边形贴图呼叫:说道 GPU 之中督导四边形处理方式和平铺的外如何处理方式来自其他用户自由空间的呼叫和图形,从而数据处理整个贴图通到处的四边形外。● 视频贴图呼叫:说道 GPU 的光学解构和视频处理方式外如何将四边形处理方式的平铺四边形图表贴图到帧默认之中。确实的处理方式比这更加简单。四边形和视频贴图呼叫本来是更加简单的构造,其之中有许多嵌套构造,而且每个呼叫上都有一个常量朝向“微序列”——由 GPU 客户端解释的小呼叫,就像自下定义虚拟 CPU。多半这些呼叫都会特设贴图更进一步,赶紧贴图顺利完成,然后搬运……但它也赞成整整砍呼叫,甚至是循环和乘法运算。所有这些构造都即可包括贴图的详细图表,例如朝向深度和常量默认的常量、帧默认大小、前提启用 MSAA(Multisample anti-aliasing,多重采样反锯齿)及其配备模式、朝向特定的辅助图形客户端,以及其他等等。两件事实上,GPU 客户端与 GPU MMU 的彼此间很奇怪。二者应用于了同一个缓存。客户端都会确实上应用于 GPU MMU 的缓存基址常量,并将其配备为 ARM64 的缓存。所以,GPU CPU就是客户端的CPU。客户端自身以及与涡轮客户端的外无线电通信都应用于了一个协作的“客户端”位址自由空间(相同于 Linux 之中的客户端位址自由空间),而一些默认是与 GPU 应用程序协作的并具有“ 其他用户自由空间”位址,这些位址在每个应用于 GPU 的应用客户端之中也很难有单独的位址自由空间。那么,我们能否将所有这些重复性重新分配到其他用户自由空间,并让它特设所有四边形或视频的贴图呼叫?不唯!由于所有这些构造与客户端本身都坐落协作的客户端位址自由空间之中,并且它们相互间有大量常量,因此在应用于 GPU 的多种不同进程相互间不一定是分立的。所以,我们不用让应用客户端确实上访问它们,因为它们有显然都会破坏彼此的贴图。这就是我们能在 macOS UAPI 之中找到了所有这些贴图显然的状况。

应用于 Python 汇编GPU 涡轮客户端

由于正确地特设所有这些构造关乎 GPU 与客户端前提都会崩解,因此我即可一种在技术手段时短整整内试验它们的方法。世人庆幸的是,Asahi Linux 工程项目有一个款来进行:m1n1 Python 基本。因为我已经在为 m1n1 行政客户端汇编 GPU 唯踪装置,并用 Python 汇编构造下定义,所以我尽快应用于 Python 汇编 GPU 的客户端涡轮客户端,应用于相同的构造下定义。Python 更加喜欢这项特殊任务,因为我可以应用于 Python 展开短整整内迭代开发的设计。另外,Python 可以应用于基本的 RTKit 协议无线电通信,并解析崩解摘要,我为此删减了来进行,这样在客户端崩解时就可以看到客户端的唯径。所有这些行政工作都是在开发的设计电脑程式上数据处理脚本顺利完成的,我的开发的设计电脑程式通过 USB 通到到了 M1 电脑程式上,因此每次检验时,只即可展开时开发的设计电脑程式即可,而且检验周期更加快。

最初,涡轮客户端的外本来只是一堆硬编码方式的构造,但之后我成功地贴图了一个四边形。

不过,这只是一个七拼八凑的预览。我只是想在动手汇编 Linux 客户端涡轮客户端之后,确保自己根本表达出来内部机制,以确保很难正确地的设计涡轮客户端。虽然只贴图每条更加单纯,但我期盼很难贴图多帧,并检验一下都将和守住等。所以,我所即可的是一个根本的“客户端涡轮客户端”。但这真是可以用 Python 借助吗?

两件正因如此,Mesa 有一个名叫 drm-shim 的来进行,可以建模 Linux DRM 客户端应用程序,并在其他用户自由空间之中应用于一些假的应用程序取而代之掉它们。多半,我们用这个库来处理方式图形 CI 等,但我们也可以用它来来作一些更加疯狂的处理方式。

我前提可以这样来作:让 Inochi2D 在 Mesa 上数据处理,后者是数据处理在 drm-shim 之下的 M1 GPU 涡轮客户端,而 drm-shim 数据处理在一个操作系统对 Python 解释装置上,将呼叫发给在 m1n1 开发的设计基本上数据处理的 Python 最初涡轮客户端,后者再通过 USB 与根本的 M1 电脑程式无线电通信并无线电通信图表,从而涡轮 GPU 客户端展开贴图?听起来不太靠谱?

然而,这真是可唯!

汇编 Linux 客户端的新的语种

由于我的 Mesa+Python 涡轮客户端真是可以数据处理,我开始更加好地探究客户端涡轮客户端的内部机制以及只能借助的功能。两件正因如此,客户端涡轮客户端即可顺利完成的特殊任务很多。首先,我只能同时兼顾 100 多个图表构造,一旦浮现任何疑虑,一切都都会崩解。客户端不都会来作任何检查(显然是为了机动性),一旦遇到错误的常量或图表,它就都会崩解或或盲目地覆盖图表。更加糟糕的是,如果客户端崩解,唯一的完全恢复方法就是展开时电脑程式。Linux 客户端 DRM 涡轮客户端是用 C 汇编的,但 C 不是汇编简单的图表构造行政的最佳语种。我只能手动唯踪每个 GPU 实例的时才都会,一旦发生任何错误,都有显然致使崩解甚至安全性漏洞。我要怎样才能毕竟这一点?显然犯错的区域内太大了,C 语种究竟帮不了我。最重要的是,我只能赞成多个正式版的客户端,新产品的客户端构造下定义在多种不同正式版相互间不一定相一致。作为试验,我加到了对第二个正式版的赞成,之后暂时删减了 100 多次图表构造。在 Python 预览之中,我可以通过一些元编程来借助,根据正式版号来紧密结合多种不同的构造数组,但 C 语种之中并未相同的功能。我只能应用于一些技巧,例如应用于多种不同的 #define 多次程式码整个涡轮客户端。我只能找到一种新的语种……大约在同一整整,关于 Rust 很快被 Linux 客户端年底底采用的此前开始浮现。多年来,Rust for Linux 工程项目一直致力借助这种赞成,看似他们的帮助之际有成果。我可以用 Rust 汇编 GPU 涡轮客户端吗?我并未太大应用于 Rust 的经验,但根据我的探究,这种语种很适合汇编 GPU 涡轮客户端。我对两个疑虑之外热衷于:Rust 前提可以期盼我建模 GPU 客户端构造的时才都会(即使这些构造与 GPU 常量相关联,从 CPU 的视角来看这算是根本的常量),Rust 宏前提可以处理方式好多个正式版的疑虑。因此,在开始客户端开发的设计之后,我向 Rust 专家学者借助期盼,并在单纯的其他用户自由空间 Rust 之中制作了 GPU 实例模型的一个最初。Rust 社区更加融洽,有几个人期盼我顺利完成了所有行政工作。在此表示感谢!看似,选择 Rust 似乎显然。但是,Rust 未被主流 Linux 来作,这不一定一定我之际进入一个未确定的行业。这将是一场赌博。不快再三,我心境一直有个歌声说道我,Rust 是正确地的选择。我与 Linux DRM 的确保部门就此展开了见面,他们似乎也来作了这个想法,所以,我尽快试试看。

应用于 Rust 汇编 GPU 客户端涡轮客户端

由于这将是第一个应用于 Rust 汇编的 Linux GPU 客户端涡轮客户端,因此我有许多行政工作要来作。我不仅即可汇编涡轮客户端,而且还即可为 Linux DRM 图形的系统对汇编 Rust 抽象化。虽然 Rust 可以确实上函数调用 C 参数,但这样来作就无法独享 Rust 的安全性必要。因此,为了从 Rust 安全性地函数调用 C 示例,首先我只能汇编包装装置,包括一个安全性的类 Rust API。之后,我汇编了一个超过 1500 唯示例的抽象化,因为出新众且安全性的的设计即可大量的思索,而且还即可编写许多示例。

8 年底 18 日,我开始汇编 Rust 涡轮客户端。最初,这个涡轮客户端依赖 C 示例来处理方式 MMU(外示例比如说 Panfrost 涡轮客户端镜像过来的),但后来我尽快用 Rust 编写所有示例。在接下来的天内之之中,我根据之后制作的最初加到了 Rust GPU 实例系统对,然后用 Rust 重新的借助了 Python 预览涡轮客户端的所有其他外。

随着应用于 Rust 的数目增多,渐渐地我爱上了这门编程语种。感觉 Rust 的的设计可以指引你的设计出新更加好的抽象化和应用软件。Rust 的程式码装置更加苛刻,但示例一旦通更进一步式码,你就可以无论如何它能准确地行政工作。有时,我不太显然让程式码装置十分满意我为了让应用于的的设计,随后我就都会意识到我的的设计存在疑虑。

逐渐地,我的涡轮客户端有了眉目。9 年底 24 日,我最后应用于我全新的的 Rust 涡轮客户端贴图了第一个立方体。

更加难以置信的是,几天后,我就可以数据处理完备的 GNOME 桌面都会话了。

Rust 很惊奇

一般来讲,汇编这样的一个简单的客户端涡轮客户端,想从单纯的预览应用客户端发展到赞成整个桌面、多个应用客户端都将应用于GPU的系统对,都会引发很多恶性竞争条件、CPU泄漏、应用于后拘禁CPU的疑虑,以及其他各种疑虑。

但这一切疑虑都并未发生。我只大修了一些语义错误和CPU行政示例内部的一个疑虑,而其他一切都可以稳定数据处理。Rust 真是很惊奇。它的安全性特性可以必要涡轮客户端的虚拟机与CPU安全性,并指引我们借助安全性且较差的的设计。

当然,示例之中显然存在一些不安全性的因素,但是由于 Rust 都会迫使你从安全性抽象化的视角展开思索,因此浮现 bug 的显然性也保持在较低的水平。但是,有些安全性疑虑仍然无法避免。例如,我的 DRM CPU行政抽象化之中存在一个 bug,之后显然都会致使在所有重新分配的CPU被拘禁之后,重新分配客户端本身先被拘禁。但是由于这类错误仅限于特定的示例,因此往往是很容易断定的主要疑虑(可以通过示例审查断定)。因此,你只即可单独再考虑特定的示例模块以及与安全性相关的外,而不必担心它们与其他所有内容的交互,之后你即可担心的错误数量也都会很少。Rust 真是很惊奇,若非亲身为了让,否则不太显然形容。

另外,还有错误和搬运。在C语种之中,我们即可通过 goto cleanup 建筑风格的错误处理方式来搬运自然资源,这些处理方式很容易犯错,但 Rust 并未这个疑虑。仅此一点,Rust 就世人为了让。更加引人注目,自动解构的迭代装置和引述总和等等。

☞☞。

总是便秘怎么办
宝宝不吃饭怎么调理吃什么
手指僵硬是怎么回事
小孩脾胃虚弱怎么调理管用
普通内科
标签:
友情链接: