RISC-V Tools编译安装三部曲之三

一、前言

撰稿人:李浩

在上两期中我们已经完成了RISC-VGCC/Newlib Toolchain、GNUtoolchain for RISC-V, ISA Simulator等工具的编译安装。并使用riscv64-unknown-linux-gnu-gcc编译了我们的linux内核。这一期我们来编译安装BusyBox。

同样不要忘了我们的环境变量:

$ export  TOP=/opt/RISCV

$ export  RISCV=$TOP/riscv

$ export  PATH=$PATH:$RISCV/bin

 

二、Building BusyBox

我们目前使用BusyBox开发,这是一组非常有用的实用程序,它们都编译成一个多用途的二进制文件。使得我们使用BusyBox而不需要修改源代码。你可以在https://www.busybox.net上获得源代码。在本例中,我们将使用BusyBox1.26.2,但其他版本应该有也可以正常工作。

目前,我们需要它的程序initash,但有bash交叉编译的RISC-V,就不再需要ash了。

第一步获取并解压缩源码:

 $curl -L http://busybox.net/downloads/busybox-1.26.2.tar.bz2 >busybox-1.26.2.tar.bz2

$tar xvjf busybox-1.26.2.tar.bz2

然后,输入目录并关闭所有配置选项:

$ cd  busybox-1.26.2

$make allnoconfig

这一步的意思是将config中的所有选项全部改为no,然后我们再将自己需要的参数设置为yes。

我们将需要更改交叉编译器,将编译设置为“静态”(如果需要,可以使其动态,但稍后必须复制一些库)。我们还将启用小程序init,ash,mount,同时,当ash的子选项的下拉菜单出现时,禁用对ash的作业控制。

下面是一些我们必须要做的配置:

·CONFIG_STATIC=y, listed as “Build BusyBox as astatic binary (no shared libs)” in BusyBox Settings Build Options

·CONFIG_FEATURE_INSTALLER=y, listed as“Support –install [-s] toinstall applet links at runtime” in BusyBox Settings General ConfigurationCONFIG_CROSS_COMPILER_PREFIX=riscv64-unknown-linux-gnu-,listed as “Cross Compiler prefix” inBusyBox Settings  Build Options

·CONFIG_INIT=y, listed as “init” in Init utilities

·CONFIG_ASH=y, listed as “ash” in Shells

·CONFIG_ASH_JOB_CONTROL=n, listed as “Ash → Job control” inShells

·CONFIG_MOUNT=y, listed as “mount” in Linux SystemUtilities

·CONFIG_FEATURE_USE_INITTAB=y, listed as “Support reading aninittab file” in Init Utilities

这一步我们推荐使用图形化的界面来寻找这些参数:

$ make   menuconfig

在随后出现的控制页面中,你可以看到上面每个参数后面所列举的目录,使用键盘控制上下左右进入这些目录,并找到相应的选项,按下Y建选中,然后退出保存。

menuconfig控制页面:

这里选项较多,请耐心一个一个寻找

$make -j16完成之后,我们需要编译BusyBox,因为我们已经通过cross-compiler指定过prefix了,所以无需再去指定$ARCH

此时依然不要忘记我们的环境变量,因为其中使用了riscv64-unknown-linux-gnu-gcc,如果提示命令未找到,就要查看我们的PATH中有没有设置他的路径。

等完成以后,就可以在RISC-V上运行BusyBox二进制交叉编译了。现在,我们需要一种方式让内核访问二进制文件,并为此使用一个根磁盘映像。在我们继续之前,返回Linux源代码目录。

$ cd  $TOP/linux-4.14.12

三、创建一个 Root Disk Image

我们使用initramfs来存储二进制文件(特别是BusyBox)。目前,我们有一个根文件系统预先打包,专门为RISC-V release创建自己的initramfs,应该拥有以下几个目录:

/bin

/dev

/etc

/lib

/proc

/sbin

/tmp

使用下面的命令创建这些目录/usr

$mkdir root

$ cd  root

$mkdir  -p  bin etc dev lib proc sbin sys tmp usr usr/bin usr/lib usr/sbin

然后,将我们刚刚编译的BusyBox可执行文件放到/bin

$ cp  $TOP/busybox-1.26.2/busybox bin

如果你已经静态地构建了BusyBox,那么就只需要这些了。如果您想动态地构建BusyBox,您需要遵循一个稍微不同的过程。我们还需要在/etc文件夹中的inittab中准备一个初始化表,在/etc目录下新建文件inittab,并写入如下内容

::sysinit:/bin/busyboxmount -t proc proc /proc

::sysinit:/bin/busyboxmount -t tmpfs tmpfs /tmp

::sysinit:/bin/busyboxmount -o remount,rw /dev/htifblk0 /

::sysinit:/bin/busybox--install -s

/dev/console::sysinit:-/bin/ash

第1行将profs文件系统挂载到/proc上。

第2行对tmpfs也做了类似的操作。

第3行将HTIF虚拟块设备(Htifbd)安装到根上。

第4行在/bin和其他地方安装各种BusyBox小程序符号逻辑链接,以使运行它们更加方便。

最后,第5行在HTIF-virtualized TTY (控制台,映射为ttyHTIF)上打开一个用于连接的ash shell

如果你想使用getty,请更改第5行以调用该代码:

::respawn:/bin/busybox getty 38400ttyHTIF0

一旦引导了Linux并创建了第4行的符号链接,它们将在Linux内核的引导之间保持不变。这将在随后的内核引导过程中造成一系列的错误。在下一次引导时,注释掉第4行。

此外,我们还需要创建一个指向/bin/busybox的符号链接,以便init工作。

$ ln -s  ../bin/busybox sbin/init

$ ln -s  sbin/init init

我们还需要一个用于控制台的字符设备:

sudo mknod dev/console c 5 1

我们准备创建我们的initramfs,<riscv-linux>为riscv-linux的路径:

find. | cpio --quiet -o -H newc > <riscv-linux>/rootfs.cpio

配置Linux以嵌入创建的cpio存档。在riscv-linux文件夹中运行:

make  ARCH=riscv menuconfig

进入General Setup,标记为“Initial RAM filesystem and RAM disk”。然后转到选项“Initramfs source file”,然后输入Enter键将其更改为“rootfs.cpio”。然后退出所有返回并保存到.config

不要忘记重新构建riscv-linuxriscv-pk

cd <riscv-linux>

make -j4 ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- vmlinux

cd <riscv-pk>/build

rm -rf *

../configure--prefix=$RISCV --host=riscv64-unknown-linux-gnu--with-payload=<riscv-linux>/vmlinux

make

make install

现在,我们已经准备好用shell启动一个最基本的内核。调用RISC-V架构的模拟器spike该命令如下所示:

$ spike bbl vmlinux

vmlinux是编译后的Linux内核二进制文件的名称。

如果没有问题,引导过程完成后会出现一个ash提示。如果没有通常的大量命令行实用程序,它将是非常无用的,但是您可以将它们添加为BusyBox小程序。

使用ctrl c,退出模拟器,。

到这里我们差不多已经完成了所有的安装任务,如果你还需要了解更多,可以查看RISC-V的官网: https://riscv.org.如果希望在内核的后续引导中重用磁盘映像,请记住删除(或注释掉)创建到BusyBox小程序的符号链接的行。不然的话,它将在每次后续引导中生成几个警告。

 

参考文献

[1] RISC-Vofficial network:https://riscv.org/software-tools/

[2]README of RISC-VGNU Compiler Toolchain:

https://github.com/riscv/riscv-gnu-toolchain

猜你喜欢

转载自blog.csdn.net/l919898756/article/details/80987456