当前位置: 首页 > Linux

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

时间:2023-04-07 03:28:35 Linux

因为很多原因,比如RISC-V设备价格昂贵,购买困难,很多小伙伴还是无法参与到RISC-V的开发中工作,尽管他们很感兴趣。今天教大家在优麒麟上搭建RISC-V交叉编译环境,快来学起来吧!交叉编译(CrossCompile)是指编译代码的平台,执行编译后的源代码的平台是两个不同的平台,比如在ARM/Linux平台下使用交叉编译工具链编译可执行文件x86/Linux平台。今天我们就来说说在优麒麟(x86/Linux)上编译RISC-V架构可执行文件的方法。为什么需要交叉编译?主要考虑如下:01.性能和速度交叉编译的目标平台往往CPU性能较差,内存和磁盘性能可能达不到编译要求。这时候就必须依赖更好的性能资源。编译主机进行编译。02.缺乏编译条件即使目标平台有足够的性能和足够的资源,也可以在本地进行编译,但是第一个运行在目标平台上的本地编译器总是需要我们通过交叉编译来获取。03.软件编译环境一个完整的Linux发行版需要由上百个包组成,而我们往往只关注目标主机上需要安装的包,所以我们可以在交叉编译主机上配置这些环境,而不是spendingtime浪费在配置目标主机的编译依赖上。本文包含以下两个部分:1.如何搭建RISC-V交叉编译环境。2.交叉编译Linux内核。1.搭建RISC-V交叉编译环境。一般来说,在搭建交叉编译环境时,需要考虑不同架构的不同特点,包括CPU架构是64位还是32位系统,字节序是big-endian还是little-endian,内存字节对齐等。幸运的是,RISC-V已经有了完整的工具链,包括交叉编译所需的binutils、gcc和glibc。●首先需要RISC-V交叉编译工具链。如果网速慢,可以忽略qemu子项目gitclone--recursivehttps://github.com/riscv/risc...这是RISC-VC++交叉编译工具链的C/,支持两种构建模式:通用ELF/Newlib工具链Linux-ELF/glibc工具链●安装所需的依赖项sudoapt-getinstall-yautoconfautotools-devcurllibmpc-devlibmpfr-devlibgmp-devgawkbuild-essentialbisonflextexinfogperflibtoolpatchutilsbczlib1g-devlibexpat-devlibncurses-devdevice-tree-compilerlibssl-devgdiskswig接下来开始编译cdriscv-gnu-toolchain./configure--prefix=/opt/riscv(路径可以根据个人习惯自定义)sudomakelinux-jnproc编译完成后,会在刚才指定的路径opt/riscv/bin下生成如下文件:,请参考https://sourceware.org/binuti...),gcc、gdb等都包含在内。这个路径可以添加到环境变量中:exportPATH=/opt/riscv/bin:$PATH也可以添加到:echo"exportPATH=/opt/riscv/bin:$PATH">>~/.bashrcgoeshere我们已经完成了交叉编译所需的环境搭建。2、编译Linux内核接下来,我们以内核源码为例,了解如何使用上述交叉编译工具链。●先下载内核源码gitclonehttps://git.kernel.org/pub/sc...●但是这里下载比较慢,可以去国内的镜像站点下载,比如清华镜像站点gitclonehttps://mirrors.tuna.tsinghua...●下载完成后gitcheckout需要打上你要编译的开发板的补丁,以hifiveunmatched为例●先下载gitclonehttps//github.com/sifive/met。..它还包含编译OpenSBI和U-Boot所需的补丁。编译过程类似。如果想自己构建系统镜像,可以分别编译这两个工具。这里以内核为例:●应用路径中f的所有补丁到/meta-sifive/recipes-kernel/linux/files/*.patch;doecho$f;patch-p1<$f;done复制defconfig配置文件cp路径到/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配置文件这个架构,所以在做menuconfig的时候也会用到这个目录。makeCROSS_COMPILE=riscv64-unknown-linux-gnu-ARCH=riscvolddefconfigmakeCROSS_COMPILE=riscv64-unknown-linux-gnu-ARCH=riscv-jnproc也可以将内核和内核模块打成tar包或deb包makeCROSS_COMPILE=riscv64-unknown-linux-gnu-ARCH=riscvINSTALL_MOD_STRIP=1-jnproctarbz2-pkgmakeCROSS_COMPILE=riscv64-unknown-linux-gnu-ARCH=riscvINSTALL_MOD_STRIP=1-jnprocbindeb-pkg添加版本号version=catinclude/config/kernel.release;echo$version编译后内核镜像文件路径为/arch/riscv/boot/Image,硬件dtb文件路径为/arch/riscv/boot/dts/sifive/hifive-unmatched-a00.dtb产生。如果选择制作deb包,将生成三个.deb文件:linux-headers-...linux-libc-dev_...linux-image-...(省略号表示版本号)我们是到这里编译完RISC-V架构的Linux内核之后,就可以基于这个内核制作自己的系统镜像了。朋友,你学会了吗?更多反馈和优化建议,请点击进入优麒麟社区论坛告诉我们~参考文档:https://github.com/carlosedp/...https://github.com/sifive/met...https://github.com/riscv-coll...https://github.com/sifive/fre...