RISC-V 架构适配知识库
  • 睿迁工具集
  • RVSmartPorting
  • 简体中文
  • English (US)
在 Gitee 上查看
  • 睿迁工具集
  • RVSmartPorting
  • 简体中文
  • English (US)
在 Gitee 上查看
  • 简介
    • 贡献规范
  • 入门
    • 内存一致性模型
    • 硬件开发板差异
    • 指令集模块
  • 通用调整
    • 检查项目对多架构的支持性
    • 文件结构调整
    • 目录结构调整
    • 测试用例调整
  • C/C++ 程序
    • 内联汇编
    • 宏定义与判断
    • 移位运算中的整形常数
    • Intrinsic 函数
    • 多版本函数
    • 系统调用
  • 汇编程序
  • 编译配置文件
    • rpmbuild
    • Makefile
    • CMake
    • Autoconf
    • QMake
    • 其它
  • 其它编程语言
    • Rust
    • Go
    • Python
    • 其它语言
  • 辅助工具集
    • 目标代码定位工具
    • 汇编指令翻译工具

检查项目对多架构的支持性

在开始针对目标架构适配软件之前,需要先确认当前软件项目 是否已支持多架构,以及 支持到何种程度。

以 RISC-V 架构为例,软件项目的状态可以分为以下几种情况:

    1. 当前软件与目标架构 完全无关
    1. 当前软件只支持 单一 目标架构
    1. 当前软件支持 两个或多个 目标架构,但尚未支持 RISC-V 架构
    1. 当前软件已 部分支持 RISC-V 架构,但仍有部分功能不支持 RISC-V 架构
    1. 当前软件已 完全支持 RISC-V 架构(无需进一步修改)

对于第 1 种情况,常见于 完全通过标准库 API 编写 的软件。 这些软件能否在目标架构上运行,完全依赖于编译器(或解释器等)是否支持目标架构, 而无需在源代码中进行任何区分,即软件本身不存在任何架构相关源代码; 另一些软件中仅包含 某个软件的资源文件,这些资源文件通常不需要被直接执行。 称以上这类软件是 架构无关 的。

提示

在 RPM 软件包管理器中,这些软件包通常含有 noarch 标记,可以安装在任何目标架构的操作系统中。

在 CentOS 7 的所有 RPM 软件包 中,有 2,727 / 10,072 个 (27.1%) 架构无关软件包。

对于第 2 种情况,常见于 针对特定架构硬件平台编写 的专用软件。 这些软件为了充分利用特定架构硬件平台的特性,往往大量使用硬件相关、架构相关的库方法与 API 等, 在其它架构平台上则几乎无法编译运行。 这些专用软件迁移难度大,成本高,在非必要的情况下应降低迁移工作优先级。 若确实需要迁移,则需要针对每处原架构相关用法寻找目标架构对应的替代用法。

对于第 3 和第 4 种情况,表明软件本身 已经为支持多架构打好了基础。 在做出进一步的修改前,应先检查并充分了解软件当前支持多架构的方式, 尽量选用相同或相似的方式支持新架构,尽量保证风格一致。

项目结构检查

一种最朴素的方式是遍历项目所有文件和目录,检查文件名或目录名中是否频繁出现常见的 架构关键字。 若某一组目录或文件下多次出现架构关键字,则可以认为软件项目已对这些不同架构引入了多架构支持。

编译配置检查

常见的编译工具链针对多架构适配提供了一些 预定义宏 和 模板方法, 开发者可利用它们编写判断条件,按照不同的目标架构切换使用不同的源文件。 若项目的编译配置中已存在这样的架构判定用法,则可以初步认为该项目 已初步支持多架构。

rpmbuild 配置文件

主要指 RPM 包管理器构建软件包时所使用的配置文件。 其中常见的架构判定用法参见 rpmbuild 配置文件

Makefile 配置文件

主要指 make 工具编译软件包时所使用的配置文件。 其中常见的架构判定用法参见 Makefile 配置文件

Autoconf 配置文件

主要指 Autoconf 工具为软件包生成编译配置时所使用的配置文件。 其中常见的架构判定用法参见 Autoconf 配置文件

源代码检查

不同的编程语言以不同的形式提供了判断目标平台架构的方法, 通常可分为 架构相关宏 和 架构信息相关 API 两类。 其中,前者通常在编译预处理阶段被解析,由编译器启用或屏蔽特定的代码块。 后者通常在运行时获取当前运行环境架构,根据获取的结果执行不同分支。

C/C++ 中的架构相关宏

重点关注是否存在以下形式的架构相关宏判断语句:

#ifdef __ARCH
#ifndef __ARCH__
#elifdef __ARCH    // Since C++ 23
#elifndef __ARCH__ // Since C++ 23
#if defined(__ARCH)
#elif defined(__ARCH__)
#if __ARCH
#elif __ARCH__
编辑本页面
最后更新时间:
贡献者: LightningRS
Next
文件结构调整

本知识库采用 木兰开放作品许可协议 署名-相同方式共享 第1版 进行许可

版权所有 © 2025 RVSmartPorting. | 京ICP备20005262号 | beian京公网安备11010802043677号