
在之前的一篇文章中,我们探讨了指令集标准化对于生态稳定和成长的重要性,并介绍了通过使用配置规范来实现标准化。标准化固然关键,但RISC-V的一大优势在于支持指令集的自定义,因此我们也需要思考如何充分利用这一特性。
本文将聚焦于软件层面需要具备哪些要素来支持硬件自定义指令,以及如何让这些指令在Ubuntu系统中正常工作。
自定义指令简单来说,就是那些不属于基础指令集定义或已批准扩展的指令。RISC-V在设计之初就明确希望支持CPU架构层面的创新。尽管许多创新集中在微架构层面(例如推测执行、超标量流水线等),但很少有指令集架构允许在架构层面进行创新。为此,RISC-V专门保留了指令编码空间,用于容纳不属于标准ISA或标准扩展的指令。
在嵌入式微控制器领域,自定义指令的好处显而易见。例如,在安全操作中,它可以加速特定加密运算;在音频处理中,它可以提供自定义DSP加速。譬如,乐鑫的ESP32-P4就提供了针对SIMD DSP的自定义扩展。
在这类系统中,实现者通常同时掌控硬件和软件——至少掌控软件工具链。但当我们考虑基于Linux的系统时,环境通常更为丰富,用户会部署以二进制形式分发的应用程序。Linux可用于软件仍然受到严格控制的嵌入式系统,并且随着部署规模的增长,越来越多的应用场景使得定制芯片变得可行。
在软硬件协同设计日益普及、企业打造垂直整合解决方案的时代,定制芯片能够应对以往无法实现的机会。近年来最著名的例子大概是苹果公司自主设计的笔记本电脑芯片,但这里也列举两个简单示例:
为定制硬件编译的软件虽然只能在相应硬件上运行,但性能或功耗上的收益仍然值得投入。
操作系统通常不会直接使用这些自定义指令,但在某些情况下操作系统需要了解它们。特别是当指令需要额外的处理器状态时,操作系统必须知晓这些状态。下面进一步解释。
状态空间是指那些随时间持续存在的东西——例如保存数据值的寄存器和报告指令输出结果的状态标志。在操作系统层面,这些状态非常重要,因为操作系统需要在中断等事件发生时能够保存和恢复这些状态。另外,寄存器通常需要由操作系统启用。这可以在启动时完成,也可以在运行时按进程进行。例如,浮点和向量寄存器文件(如果实现的话)默认是禁用的,只有操作系统启用后,应用程序代码才能使用它们。即使某个实现不要求操作系统启用用户对特定状态的访问,如果在操作系统中未妥善处理,也可能导致数据损坏或执行问题。
如果自定义指令仅影响数据处理,且不需要额外的状态空间,那么无需修改操作系统代码即可管理。例如,那些将数据视为4位数据类型、但仅使用普通整数寄存器文件和状态寄存器的指令,可以在不通知操作系统的情况下实现。
构建使用这些指令的应用程序,需要预先编译好的库(其中已实现这些指令),或者使用能定位这些指令的自定义工具链。Ubuntu的launchpad.net构建基础设施支持通过私有包归档(PPA)来使用自定义工具链。工具链可以在自己的PPA中独立构建,也可以将预编译的二进制工具链作为应用程序代码源代码树的一部分包含进来。无论哪种方式,应用程序代码随后都会被构建并发布到PPA中。
通过将PPA与Ubuntu内核及通用软件包分发结合使用,用户既能享受Canonical提供的安全更新和维护补丁,又能获得定制硬件带来的性能提升。
如上所述,需要状态空间的自定义指令更为复杂,因为它们需要自定义内核来处理上下文保存和恢复(例如中断场景),或者允许用户空间访问额外状态。因此,除了自定义工具链和应用程序代码,你还需要创建自定义内核。即便在这种情况下,launchpad.net基础设施仍然可以提供帮助。第一步依然是提供自定义工具链。
Canonical已与多家RISC-V合作伙伴合作,开发了一份镜像制作手册,其中详细说明了创建自定义内核软件包所需的步骤。如果你正考虑构建自定义内核,这应该作为你的起点。
自定义内核准备就绪后,你可以按照上述流程继续:构建工具链、内核以及用户软件包。
自定义内核的缺点是它不会由Canonical维护,因此PPA中软件包的安全更新和补丁需要你自己管理(但我们主仓库中的标准软件包仍然会由Canonical提供支持和更新)。
到目前为止,我们假设软件只会运行在具备相关自定义指令支持的硬件上。虽然这在嵌入式系统中可能成立,但对于构建Linux二进制软件包的工程师来说,这样做会使软件失去可移植性。如果二进制文件假定某个自定义指令可用,那么在不支持该指令的硬件上运行时,会触发非法指令陷阱。
更合理的做法是编写能够在运行时检测自定义指令是否可用的软件,并调用相应的代码路径。这种方法同样适用于标准扩展——例如检测浮点指令是否实现。如果实现了,可以启用硬件浮点;如果没有,则软件可以使用软浮点实现,而不是直接崩溃或出错。
关注微信号:智享开源 ,及时了解更新信息。
原文链接:https://ubuntu.com//blog/how-to-use-risc-v-custom-instructions-with-ubuntu
你必须 登录 才能发表评论.
| 微信捐赠 | 支付宝捐赠 |
|---|---|
![]() |
![]() |
扫码关注公众号:智享开源

[blog_mailer_subscribe]
还没有任何评论,你来说两句吧!