教你如何在優(yōu)麒麟上搭建 RISC-V 交叉編譯環(huán)境

由于 RISC-V 設(shè)備價格昂貴、不易采購等諸多原因,許多小伙伴雖然很感興趣,但仍無法參與 RISC-V 開發(fā)工作,今天就教大家如何在優(yōu)麒麟上搭建 RISC-V 交叉編譯環(huán)境,快學起來吧!
交叉編譯(Cross Compile)指編譯代碼的平臺,和執(zhí)行編譯后源代碼的平臺是兩個不同的平臺,比如在 x86/Linux 平臺下使用交叉編譯工具鏈編譯 ARM/Linux 平臺下的可執(zhí)行文件。今天我們要講的就是在優(yōu)麒麟(x86/Linux)上編譯 RISC-V 架構(gòu)可執(zhí)行文件的方法。
我們?yōu)槭裁葱枰徊婢幾g呢,主要有以下考慮:
01.性能與速度
交叉編譯的目標平臺往往 CPU 性能較差,內(nèi)存和磁盤性能也可能不能滿足編譯的要求,這時候就要依賴性能資源更好的編譯主機進行編譯。
02.缺乏編譯條件
就算目標平臺性能足夠且資源充足,可以本地編譯,但第一個在目標平臺運行的本地編譯器總是需要我們通過交叉編譯獲得。
03.軟件編譯環(huán)境
一個完整的 Linux 發(fā)行版需要由數(shù)百個包構(gòu)成,而我們往往只關(guān)注需要在目標主機上安裝的包,所以我們可以在交叉編譯的主機上配置這些環(huán)境,而不是把時間浪費在配置目標主機的編譯依賴上。
本文包含以下兩部分:
1、如何搭建一個 RISC-V 的交叉編譯環(huán)境。
2、交叉編譯 Linux 內(nèi)核。
一、搭建 RISC-V 交叉編譯環(huán)境。
通常來講,在搭建交叉編譯環(huán)境時需要考慮不同體系架構(gòu)的不同特性,包括 CPU 架構(gòu)是 64 位還是 32 位系統(tǒng)、字節(jié)序是大端( big-endian )或小端( little-endian )、內(nèi)存字節(jié)對齊方式等,不過好在 RISC-V 已經(jīng)有完善的工具鏈,包含交叉編譯所需的 binutils 、 gcc 和 glibc 3 個部分。
● 首先需要 RISC-V 交叉編譯工具鏈,如果網(wǎng)絡(luò)較慢,可以忽略其中的 qemu 子項目
git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
這是 RISC-V 的 C/C++ 交叉編譯工具鏈,其支持兩種構(gòu)建模式:
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(路徑可以根據(jù)個人習慣自定義) sudo make linux -j `nproc`
編譯完成后,剛才指定的路徑 opt/riscv/bin 下會生成以下文件:
交叉編譯所需的工具,包括 Binutils(ld,as,ar 等,了解詳情可參考https://sourceware.org/binutils/docs-2.37/binutils/index.html )、gcc 、gdb 等都在其中。
可以將這個路徑添加到環(huán)境變量中:
export PATH=/opt/riscv/bin:$PATH
也可以添加到:
echo "export PATH=/opt/riscv/bin:$PATH" >> ~/.bashrc
到這里我們就完成了交叉編譯所需環(huán)境的搭建。
二、編譯 Linux 內(nèi)核
接下來我們以內(nèi)核源碼為例,了解一下上述交叉編譯工具鏈的使用方法。
● 首先下載內(nèi)核源碼
git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
● 不過這里下載較慢,可以去國內(nèi)的鏡像站下載,比如清華大學鏡像站
git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux-stable.git
● 下載完成后
git checkout
接下來將需要打上你想要編譯的開發(fā)板的 patch ,以 hifive unmatched 為例
● 首先下載
git clone https://github.com/sifive/meta-sifive
這里面還包含了編譯 OpenSBI 和 U-Boot 所需的 patch ,編譯過程大同小異,如果想要自己構(gòu)建一個系統(tǒng)鏡像,可以分別編譯這兩個工具。這里以內(nèi)核為例:
● 打上所有 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
如果想避免產(chǎn)生額外后綴名,可以添加
touch .scmversion
接下來開始編譯內(nèi)核,這里需要指定 make 的兩個參數(shù):
1、CROSS_COMPILE:交叉編譯器的前綴,表示將代碼編譯編譯成目標CPU指令的工具,如果不指定,make 會默認使用系統(tǒng)自帶的 gcc 來編譯,這里指定我們之前編譯出來的 riscv64-unknown-linux-gnu- 為前綴。
2、ARCH:即 architecture ,用于選擇編譯哪種 CPU 架構(gòu),也就是編譯 arch/ 目錄下的哪個子目錄,這里指定 ARCH=riscv ,arch/riscv 目錄下也包含此架構(gòu)特有的 Kconfig 配置文件,所以 make menuconfig 時也會用到這個目錄。
make CROSS_COMPILE=riscv64-unknown-linux-gnu- ARCH=riscv olddefconfig make CROSS_COMPILE=riscv64-unknown-linux-gnu- ARCH=riscv -j`nproc`
也可以將內(nèi)核和內(nèi)核模塊打成 tar 包或 deb 包
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
添加版本號
version=`cat include/config/kernel.release`;echo $version
編譯完成后,會生成 path to/arch/riscv/boot/Image 內(nèi)核鏡像文件和 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 架構(gòu) Linux 內(nèi)核的編譯,接下來便可以基于這個內(nèi)核制作自己的系統(tǒng)鏡像。
各位小伙伴,你學會了嗎?
參考文檔:
https://github.com/sifive/meta-sifive/tree/2021.12/recipes-kernel/linux/files
https://github.com/riscv-collab/riscv-gnu-toolchain
https://github.com/sifive/freedom-u-sdk
到此這篇關(guān)于手把手教你在優(yōu)麒麟上搭建 RISC-V 交叉編譯環(huán)境的文章就介紹到這了,更多相關(guān)優(yōu)麒麟搭建RISC-V環(huán)境內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
桌面麒麟系統(tǒng)怎么添加新字體? 麒麟操作系統(tǒng)上安裝和管理字體的技巧
桌面麒麟系統(tǒng)怎么添加新字體?麒麟系統(tǒng)自帶的字體不夠用,想要安裝新字體,該怎么操作呢?下面我們就來看看麒麟操作系統(tǒng)上安裝和管理字體的技巧2023-11-14教你如何在優(yōu)麒麟上搭建 RISC-V 交叉編譯環(huán)境
交叉編譯指編譯代碼的平臺,和執(zhí)行編譯后源代碼的平臺是兩個不同的平臺,今天我們要講的就是在優(yōu)麒麟(x86/Linux)上編譯 RISC-V 架構(gòu)可執(zhí)行文件的方法,感興趣的朋友一起2022-03-22- 今天小編為大家?guī)淼氖荳IN7/8/10+麒麟 雙系統(tǒng)攻略講解;希望對大家會有幫助,有需要的朋友一起去看看吧2017-03-14
Kylin (麒麟)2.0 服務(wù)器版安裝vsftpd-2.0.4
Kylin(麒麟系統(tǒng))上安裝Discuz!論壇出現(xiàn)亂碼!
- 根據(jù)插USB閃存盤和移動硬盤的先后順序不同掛載方法略有不同,下面分別說明: 第一種情況: 先插USB閃盤,首先必須在 mnt 目錄下建立文件夾 usb_1,執(zhí)行后在2008-09-08
- 請在終端命令行執(zhí)行以下命令: Kylin掛載usb閃存盤命令 (首先必須在 mnt 目錄下建立文件夾 usb_1,執(zhí)行后在我的電腦里可以看見 usb_1 盤符。msdos 指 fat 文件系2008-09-08
- 軟盤必須是被正確格式化好的,即F12文件系統(tǒng),軟盤必須有正確的引導區(qū),即0磁道是好的2008-09-08