RISC-V Linux 用户 ABI¶
/proc/cpuinfo 中的 ISA 字符串排序¶
ISA 字符串中 ISA 扩展名称的规范顺序定义在《RISC-V 指令集手册卷 I 非特权 ISA》(文档版本 20191213)的第 27 章中。
该规范在涉及排序时使用了模糊的措辞,例如“should”(应该),因此出于我们的目的,适用以下规则
单字母扩展排在最前面,按规范顺序排列。规范顺序为“IMAFDQLCBKJTPVH”。
所有多字母扩展都将用下划线与其它扩展分隔开。
附加标准扩展(以 ‘Z’ 开头)将排在单字母扩展之后,在任何更高特权级的扩展之前。
对于附加标准扩展,‘Z’ 后面的第一个字母通常表示最密切相关的字母扩展类别。如果命名了多个 ‘Z’ 扩展,它们将首先按类别(按照上面列出的规范顺序)排序,然后在同一类别内按字母顺序排序。
标准监督者级(supervisor-level)扩展(以 ‘S’ 开头)将列在标准非特权扩展之后。如果列出了多个监督者级扩展,它们将按字母顺序排序。
标准机器级(machine-level)扩展(以 ‘Zxm’ 开头)将列在任何更低特权级的标准扩展之后。如果列出了多个机器级扩展,它们将按字母顺序排序。
非标准扩展(以 ‘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 模式扩展,出现在这些行中并不保证内核正在利用该扩展,也不保证该功能在由该内核管理的客户虚拟机中可见。
相反,在这些行中缺失某个扩展并不一定意味着硬件不支持该功能。正在运行的内核可能无法识别该扩展,或者可能已故意将其从列表中移除。
对齐错误访问¶
用户空间支持对齐错误(非对齐)标量访问,但其性能可能较差。仅在支持 Zicclsm 扩展的情况下,才支持对齐错误(非对齐)向量访问。
指针掩码¶
用户空间中对指针掩码(Supm 扩展)的支持通过 PR_SET_TAGGED_ADDR_CTRL 和 PR_GET_TAGGED_ADDR_CTRL prctl() 操作提供。指针掩码默认处于禁用状态。要启用它,用户空间必须调用 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 TAGGED ADDRESS ABI)。