指令集与 ABI

本移植面向带 Sv32 虚拟内存的 32 位 RISC-V。构建时应以以下各组件的编译器配置为准。设备树声明 Linux 使用的扩展;简写的硬件功能标签不能代替受支持的 -march 值。

各组件的编译器配置

组件

指令集选择

ABI / 环境

OpenSBI

rv32imabc_zicsr_zifencei_zaamo_zalrsc_zba_zbb_zbc_zbs

ilp32,固件

Linux 内核

rv32imafbc_zicsr_zifencei_zaamo_zalrsc_zba_zbb_zbc_zbs

ilp32f,已修改的内核构建

应用与库

rv32imafbc_zicsr_zifencei_zaamo_zalrsc_zba_zbb_zbc_zbs

ilp32,项目 Linux/musl 工具链

无线载荷

rv32imafc_zicsr_zifencei_zaamo_zalrsc_xesploop_xespv2p2

ilp32f,ESP ELF/picolibc 构建

这些配置来自原生构建配置、musl 工具链配置、应用编译标志、内核 ABI 修改和无线构建。

-march 选择指令,-mabi 选择参数与返回值的调用约定。ilp32 应用可以在内部使用 F 指令,同时按软浮点调用约定传递浮点参数。内核的 ilp32f 标志不会改变 musl 应用 ABI。Linux 应用及其依赖库应统一采用 ilp32;无线载荷使用的独立运行时库不能替代 musl。

浮点与额外状态

本移植的 FPU 上下文路径通过 fsw / flw 保存和恢复单精度 F 寄存器;普通构建不以 D 扩展为目标。Linux 还通过平台 SBI 协处理器服务处理 Espressif 扩展状态。参见 F 上下文实现及 Linux 额外状态调用。内核和固件代码仍需遵守其上下文与浮点使用规则;编译器 ABI 标志本身不能保证任意 FPU 操作安全。

XespV 与 Xesploop

本移植将 HP 核 1 视为唯一允许执行 XespV 的核:OpenSBI 跳过 hart 0 上的 PIE 状态访问,libesp-simd 则在进入汇编例程前将调用线程绑定到 CPU1。参见 OpenSBI 限制。

通过 esp_simd.h 使用 libesp-simd,并以 -lesp-simd 链接。其构造函数初始化初始线程;每个新的调用线程在首次使用时初始化。esp_simd_init() 返回零或负 errno;亲和性设置失败时,公开操作的包装函数使用标量回退实现。亲和性影响整个调用线程。初始化成功后,不要将该线程移到 CPU0 或扩大亲和性掩码:成功状态会被缓存,之后的亲和性变化不会重新检查。应用指南包含完整的构建、链接和运行示例;具体行为由库实现定义。

普通应用编译标志不包含 XespV 和 Xesploop。SIMD 软件包显式编译手写的扩展汇编;项目不依赖自动 XespV 向量化。

Linux 和 OpenSBI 实现了 HWLoop/PIE 上下文处理,但源码支持不代表当前镜像已验证任意启用扩展的应用。应将扩展使用限制在已审查的库 / 固件路径内;普通应用的编译标志没有全局启用 Xesploop。参见应用编译标志、Linux 上下文处理和 SIMD 软件包标志。