教你如何在优麒麟上搭建 RISC-V 交叉编译环境

news2024/9/24 5:29:52

由于 RISC-V 设备价格昂贵、不易采购等诸多原因,许多小伙伴虽然很感兴趣,但仍无法参与 RISC-V 开发工作,今天就教大家如何在优麒麟上搭建 RISC-V 交叉编译环境,快学起来吧!

交叉编译(Cross Compile)指编译代码的平台,和执行编译后源代码的平台是两个不同的平台,比如在 x86/Linux 平台下使用交叉编译工具链编译 ARM/Linux 平台下的可执行文件。今天我们要讲的就是在优麒麟(x86/Linux)上编译 RISC-V 架构可执行文件的方法。

我们为什么需要交叉编译呢,主要有以下考虑:

01.性能与速度

交叉编译的目标平台往往 CPU 性能较差,内存和磁盘性能也可能不能满足编译的要求,这时候就要依赖性能资源更好的编译主机进行编译。

02.缺乏编译条件

就算目标平台性能足够且资源充足,可以本地编译,但第一个在目标平台运行的本地编译器总是需要我们通过交叉编译获得。

03.软件编译环境

一个完整的 Linux 发行版需要由数百个包构成,而我们往往只关注需要在目标主机上安装的包,所以我们可以在交叉编译的主机上配置这些环境,而不是把时间浪费在配置目标主机的编译依赖上。

本文包含以下两部分:

1、如何搭建一个 RISC-V 的交叉编译环境。

2、交叉编译 Linux 内核。

一、搭建 RISC-V 交叉编译环境。

通常来讲,在搭建交叉编译环境时需要考虑不同体系架构的不同特性,包括 CPU 架构是 64 位还是 32 位系统、字节序是大端( big-endian )或小端( little-endian )、内存字节对齐方式等,不过好在 RISC-V 已经有完善的工具链,包含交叉编译所需的 binutils 、 gcc 和 glibc 3 个部分。

● 首先需要 RISC-V 交叉编译工具链,如果网络较慢,可以忽略其中的 qemu 子项目

1

git clone --recursive https://github.com/riscv/riscv-gnu-toolchain

这是 RISC-V 的 C/C++ 交叉编译工具链,其支持两种构建模式:

1. 通用 ELF/Newlib 工具链

2. Linux-ELF/glibc 工具链

● 安装所需依赖包

1

sudo apt-get install -y autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev libncurses-dev device-tree-compiler libssl-dev gdisk swig

● 接下来开始编译

1

2

3

cd riscv-gnu-toolchain

./configure --prefix=/opt/riscv(路径可以根据个人习惯自定义)

sudo make linux -j `nproc`

编译完成后,刚才指定的路径 opt/riscv/bin 下会生成以下文件:

交叉编译所需的工具,包括 Binutils(ld,as,ar 等,了解详情可参考https://sourceware.org/binutils/docs-2.37/binutils/index.html )、gcc 、gdb 等都在其中。

可以将这个路径添加到环境变量中:

1

export PATH=/opt/riscv/bin:$PATH

也可以添加到:

1

echo "export PATH=/opt/riscv/bin:$PATH" >> ~/.bashrc

到这里我们就完成了交叉编译所需环境的搭建。

二、编译 Linux 内核

接下来我们以内核源码为例,了解一下上述交叉编译工具链的使用方法。

● 首先下载内核源码

1

git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

● 不过这里下载较慢,可以去国内的镜像站下载,比如清华大学镜像站

1

git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux-stable.git

● 下载完成后

1

git checkout

接下来将需要打上你想要编译的开发板的 patch ,以 hifive unmatched 为例

● 首先下载

1

git clone https://github.com/sifive/meta-sifive

这里面还包含了编译 OpenSBI 和 U-Boot 所需的 patch ,编译过程大同小异,如果想要自己构建一个系统镜像,可以分别编译这两个工具。这里以内核为例:

● 打上所有 patch

1

for f in path to /meta-sifive/recipes-kernel/linux/files/*.patch; do echo $f;patch -p1 < $f;done

● 复制 defconfig 配置文件

1

cp path to /meta-sifive/recipes-kernel/linux/files/defconfig  ./.config

如果想避免产生额外后缀名,可以添加

1

touch .scmversion

接下来开始编译内核,这里需要指定 make 的两个参数:

1、CROSS_COMPILE:交叉编译器的前缀,表示将代码编译编译成目标CPU指令的工具,如果不指定,make 会默认使用系统自带的 gcc 来编译,这里指定我们之前编译出来的 riscv64-unknown-linux-gnu- 为前缀。

2、ARCH:即 architecture ,用于选择编译哪种 CPU 架构,也就是编译 arch/ 目录下的哪个子目录,这里指定 ARCH=riscv ,arch/riscv 目录下也包含此架构特有的 Kconfig 配置文件,所以 make menuconfig 时也会用到这个目录。

1

2

make CROSS_COMPILE=riscv64-unknown-linux-gnu- ARCH=riscv olddefconfig

make CROSS_COMPILE=riscv64-unknown-linux-gnu- ARCH=riscv -j`nproc`

也可以将内核和内核模块打成 tar 包或 deb 包

1

2

make CROSS_COMPILE=riscv64-unknown-linux-gnu- ARCH=riscv    INSTALL_MOD_STRIP=1 -j`nproc` tarbz2-pkg

make CROSS_COMPILE=riscv64-unknown-linux-gnu- ARCH=riscv INSTALL_MOD_STRIP=1 -j`nproc` bindeb-pkg

添加版本号

1

version=`cat include/config/kernel.release`;echo $version

编译完成后,会生成 path to/arch/riscv/boot/Image 内核镜像文件和 path to/arch/riscv/boot/dts/sifive/hifive-unmatched-a00.dtb 硬件 dtb 文件。

如果选择打成 deb 包,会生成三个 .deb 文件:

1. linux-headers-...

2. linux-libc-dev_...

3. linux-image-...

(其中省略号表示版本号)

到这里我们就完成了 RISC-V 架构 Linux 内核的编译,接下来便可以基于这个内核制作自己的系统镜像。

各位小伙伴,你学会了吗?

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32371.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

收藏 | 机器学习公共数据集集锦(附下载链接)

>>>深度学习Tricks&#xff0c;第一时间送达<<< &#x1f680;&#x1f680;&#x1f680;近期&#xff0c;小海带在空闲之余&#xff0c;收集整理了一批机器学习公共数据集供大家参考。 整理不易&#xff0c;小伙伴们记得一键三连喔&#xff01;&#xff0…

cpu天梯图2022年11月 cpu排行榜天梯图2022

一、i9-13900K 1、13900K参数&#xff1a;24核32线程&#xff0c;睿频5.8GHz&#xff0c;基础功耗125W&#xff0c;最大睿频功耗253W。 2、推荐搭配主板&#xff1a;Z790、B760、Z690、B660。 3、目前单核性能最强的一款CPU&#xff0c;拥有超强的超频能力&#xff0c;为玩家带…

swift指针内存管理-引用

引用探究 首先看一个例子 那么这个 0x0000000000000003 是什么意思呢 回到swift源码 找到关键核心类型 HeapObject 就是 swift 分配内存获取到的结构类型 HeapObject 第一个8字节为 metadata, 接下来是宏 InlineRefCounts 其实 就是泛型真正类型 InlineRefCountBits 至此&am…

Android性能优化方法论

作为一名开发&#xff0c;性能优化是永远绕不过去的话题&#xff0c;在日常的开发中&#xff0c;我们可肯定都会接触过。Android 的性能优化其实是非常成熟的了&#xff0c;成熟的套路&#xff0c;成熟的方法论&#xff0c;成熟的开源框架等等。 对于接触性能优化经验较少的开…

大学生简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

APS计划排程结果的量化评价

APS计划排程系统是供应链管理软件中的一种提升管理决策协助系统软件&#xff0c;它通过约束理论、运用多种多样数学分析优化计算方法、有常驻运行内存运转的互动式计算机软件。它借助于某些繁杂的数学运算方式 来处理多种多样自变量&#xff0c;使供应链管理的提升变成事实。 A…

计硕3班-陈陇刚-2022222278-第二章 递归与分治策略 作业

目录 1. 概括第二章学习内容&#xff0c;总结第二章学习心得 1.1 递归 1.1.1 递归的定义 1.1.2 递归的使用场景 1.2 分治 1.2.1 分治的定义 1.2.2 分治法使用场景 1.3 学习心得 2. 描述Fibonacci数列递归算法&#xff0c;并进行时间复杂度分析 2.1 Fibonacci数列定义 …

测试人经验谈:需求不明确也能写出测试用例

测试人员的用例编写&#xff0c;一般基于经验和需求文档进行&#xff0c;但是很多时候项目是没有需求的&#xff0c;特别是领导的某个概念提出&#xff0c;然后开发会根据自己的理解完成&#xff0c;测试人员在没有获得任何依据和需求的情况下如何编写测试用例呢&#xff1f; …

【数据结构】七种排序方法,一篇文章掌握

文章目录前言1. 直接插入排序1.1 画图演示1.2 直接插入排序详细步骤1.3 时间复杂度&#xff0c;空间复杂度分析2. 希尔排序2.1 具体步骤描述2.2 代码详解2.3时间复杂度,空间复杂度分析3. 选择排序3.1 画图讲解3.2 代码讲解3.3 时间复杂度,空间复杂度分析4. 快速排序4.1 画图演示…

【C++初阶7-string】真方便,真舒服

前言 本期浅学一下STL的stirng。 内容概览&#xff1a; STLstring 是什么为什么怎么用&#xff08;接口介绍及使用&#xff09; 博主水平有限&#xff0c;不足之处望请斧正&#xff01; 先导 STL C中非常重要的一个东西&#xff0c;STL(Standard Template Library) 标准…

详解华夏银行iDo平台一体化运维的落地过程

随着数字化转型的深入&#xff0c;基于中台和PaaS架构的一体化运维建设也在各行各业快速展开&#xff0c;但是如何将运维平台本身的能力与企业已有的工具能力进行中台化整合、工具场景如何联动&#xff0c;是个复杂而庞大的工程。 本次&#xff0c;史春志老师以华夏银行运维平…

【Revit二次开发】元素(Element)

图元与图元类型元素元素 元素(Element)也称图元 图元作为revit建模的基础&#xff0c;数量庞大&#xff0c;关系千丝万缕。先了解图元的分类&#xff0c;将会帮助我们整理思路&#xff0c;找到功能开发的关键点。 每一个人都可以按照自己的思路将图元进行分类。建模人员可以按…

vue详细教程

原文链接&#xff1a;https://www.cnblogs.com/MrFlySand/p/16921017.html 02vue的安装 程序说明 1、在body中有2个counter&#xff0c;一个是id&#xff0c;一个是class。 2、创建应用&#xff0c;分别用id和class将配置对象传入 语法&#xff1a;Vue.createApp(方法名).mount…

DPDK之PMD原理

PMD是Poll Mode Driver的缩写&#xff0c;即基于用户态的轮询机制的驱动。本文将介绍PMD的基本原理。 在不考虑vfio的情况下&#xff0c;PMD的结构图如下&#xff1a; 图1. PMD结构图 虽然PMD是在用户态实现设备驱动&#xff0c;但还是依赖于内核提供的策略。其中uio模块&…

Java 面试题 —— TCP 粘包、拆包问题

Java 面试题 —— TCP 粘包、拆包问题 1、粘包、拆包问题概况 正常情况&#xff1a; ​  服务端一共接收到客户端的两个数据包&#xff0c;两个数据包各自包含完整的消息。 粘包问题&#xff1a; ​  服务端一共接收到客户端的一个数据包&#xff0c;这个数据包共包含两条…

【java进阶06:数组】使用一维数组模拟栈数据结构 使用二维数组模拟酒店,酒店管理系统 Arrays工具类 冒泡排序算法、选择排序算法、二分法

目录 数组 二维数组 总结 作业 Arrays工具类 数组 数组总结 及 静态初始化一维数组 /* Array:1、java语言中的数组是一种引用数据类型&#xff0c;不属于基本数据类型&#xff0c;数组的父类是Object2、数组实际上是一个容器&#xff0c;可以同时容纳多个元素&#xff08…

【负荷预测、电价预测】基于神经网络的负荷预测和价格预测(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Webpack DevServerExpress 中间件

前言 webpack-dev-server 底层是 express webpack-dev-middleware。 express是基础。 webpack-dev-middleware是中间件&#xff0c;以监听模式启动 webpack&#xff0c;将编译后的文件输出到内存&#xff08;使用fs-memory&#xff09;&#xff0c;沟通webpack的HRM&#xf…

机器学习之特征提取

Question Orientied:来自论文的一个学习点 Feature extraction 定义&#xff1a; 特征提取是指使用计算机提取图像中属于特征性的信息的方法及过程。 简言之 提取图像关键信息。 特征提取出来的结果叫特征向量。 进入主题之前 普及几个常识&#xff1a; 像素的英文名称:Pixe…

Flutter 完全手册

小册介绍 Flutter 作为一个跨平台的框架&#xff0c;其开发技术栈融合了 Native 和前端的技术&#xff0c;不仅涉及到了 Native&#xff08;Android、iOS &#xff09;的开发知识&#xff0c;又吸取了很多前端&#xff08;例如 React&#xff09;的技术理念和框架&#xff0c;并…