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 模式扩展,在这些行之一中的存在并不能保证内核正在利用该扩展,或者该功能将在由该内核管理的来宾 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)。