关于linux:手把手教你在优麒麟上搭建-RISCV-交叉编译环境

4次阅读

共计 3040 个字符,预计需要花费 8 分钟才能阅读完成。

因为 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 子项目

git clone –recursive https://github.com/riscv/risc…
这是 RISC-V 的 C/C++ 穿插编译工具链,其反对两种构建模式:

  1. 通用 ELF/Newlib 工具链
  2. Linux-ELF/glibc 工具链

● 装置所需依赖包

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
● 接下来开始编译

cd riscv-gnu-toolchain
./configure –prefix=/opt/riscv(门路能够依据集体习惯自定义)
sudo make linux -j nproc
编译实现后,方才指定的门路 opt/riscv/bin 下会生成以下文件:

穿插编译所需的工具,包含 Binutils(ld,as,ar 等,理解详情可参考 https://sourceware.org/binuti…)、gcc、gdb 等都在其中。

能够将这个门路增加到环境变量中:

export PATH=/opt/riscv/bin:$PATH
也能够增加到:

echo “export PATH=/opt/riscv/bin:$PATH” >> ~/.bashrc
到这里咱们就实现了穿插编译所需环境的搭建。

二、编译 Linux 内核

接下来咱们以内核源码为例,理解一下上述穿插编译工具链的应用办法。

● 首先下载内核源码

git clone https://git.kernel.org/pub/sc…
● 不过这里下载较慢,能够去国内的镜像站下载,比方清华大学镜像站

git clone https://mirrors.tuna.tsinghua…
● 下载实现后

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

● 首先下载

git clone https://github.com/sifive/met…
这外面还蕴含了编译 OpenSBI 和 U-Boot 所需的 patch,编译过程大同小异,如果想要本人构建一个零碎镜像,能够别离编译这两个工具。这里以内核为例:

● 打上所有 patch

for f in path to /meta-sifive/recipes-kernel/linux/files/*.patch; do echo $f;patch -p1 < $f;done
● 复制 defconfig 配置文件

cp path to /meta-sifive/recipes-kernel/linux/files/defconfig ./.config
如果想防止产生额定后缀名,能够增加

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 时也会用到这个目录。

make CROSS_COMPILE=riscv64-unknown-linux-gnu- ARCH=riscv olddefconfig
make CROSS_COMPILE=riscv64-unknown-linux-gnu- ARCH=riscv -jnproc
也能够将内核和内核模块打成 tar 包或 deb 包

make CROSS_COMPILE=riscv64-unknown-linux-gnu- ARCH=riscv INSTALL_MOD_STRIP=1 -jnproc tarbz2-pkg
make CROSS_COMPILE=riscv64-unknown-linux-gnu- ARCH=riscv INSTALL_MOD_STRIP=1 -jnproc bindeb-pkg
增加版本号

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 内核的编译,接下来便能够基于这个内核制作本人的零碎镜像。

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

更多问题反馈和优化倡议,请点击进入优麒麟社区论坛通知咱们哦~

参考文档:

https://github.com/carlosedp/…

https://github.com/sifive/met…

https://github.com/riscv-coll…

https://github.com/sifive/fre…

正文完
 0