RISC-V Linux 用户 ABI

/proc/cpuinfo 中的 ISA 字符串排序

ISA 字符串中 ISA 扩展名称的规范顺序在非特权规范的第 27 章中定义。 该规范使用了含糊的措辞,例如在排序时应该,因此,出于我们的目的,以下规则适用

  1. 单字母扩展名首先出现,按规范顺序排列。 规范顺序是 “IMAFDQLCBKJTPVH”。

  2. 所有多字母扩展名将用下划线与其他扩展名分隔开。

  3. 其他标准扩展名(以“Z”开头)将在单字母扩展名之后,任何更高特权的扩展名之前排序。

  4. 对于其他标准扩展名, “Z”后面的第一个字母通常表示最密切相关的字母扩展名类别。 如果命名了多个“Z”扩展名,则它们将首先按类别排序,按上述规范顺序排序,然后在类别内按字母顺序排序。

  5. 标准主管级别扩展(以 “S” 开头)将在标准非特权扩展之后列出。 如果列出了多个主管级别扩展,则它们将按字母顺序排列。

  6. 标准机器级别扩展(以“Zxm”开头)将在任何较低特权的标准扩展之后列出。 如果列出了多个机器级别扩展,则它们将按字母顺序排列。

  7. 非标准扩展(以 “X” 开头)将在所有标准扩展之后列出。 如果列出了多个非标准扩展,则它们将按字母顺序排列。

以下是一个遵循该顺序的字符串示例

rv64imadc_zifoo_zigoo_zafoo_sbar_scar_zxmbaz_xqux_xrux

/proc/cpuinfo 中的 “isa” 和 “hart isa” 行

/proc/cpuinfo 中的 “isa” 行描述了内核识别的并在所有 hart 上实现的 RISC-V ISA 扩展的最低公分母。“hart isa” 行则相反,描述了内核在特定 hart 上识别的扩展集,即使这些扩展可能不存在于系统中的所有 hart 上。

在这两行中,扩展的存在仅保证硬件具有所描述的功能。在扩展的功能可以被用户空间程序完全使用之前,可能需要额外的内核支持或策略更改。类似地,对于 S 模式扩展,出现在这些行中的一个并不保证内核正在利用该扩展,或者该功能将在由此内核管理的 guest VM 中可见。

相反,这些行中缺少扩展并不一定意味着硬件不支持该功能。 运行的内核可能无法识别该扩展,或者可能已故意将其从列表中删除。

未对齐的访问

用户空间支持未对齐的标量访问,但它们的性能可能较差。 仅当支持 Zicclsm 扩展时,才支持未对齐的向量访问。

指针掩码

通过 PR_SET_TAGGED_ADDR_CTRLPR_GET_TAGGED_ADDR_CTRL prctl() 操作提供对用户空间中指针掩码(Supm 扩展)的支持。 默认情况下,指针掩码已禁用。 要启用它,用户空间必须调用 PR_SET_TAGGED_ADDR_CTRL,并将 PR_PMLEN 字段设置为应用程序所需的掩码/标签位数。 PR_PMLEN 被解释为下限; 如果内核无法满足请求,则 PR_SET_TAGGED_ADDR_CTRL 操作将失败。 实际的标签位数由 PR_GET_TAGGED_ADDR_CTRL 操作在 PR_PMLEN 中返回。

此外,当启用指针掩码(PR_PMLEN 大于 0)时,支持标记地址 ABI,其接口和行为与 AArch64 的文档相同 (AArch64 标记地址 ABI)。