TA的每日心情 | 开心 2019-11-4 13:48 |
---|
签到天数: 14 天 连续签到: 1 天 [LV.3]偶尔看看II
|
撰稿人:李浩
一、前言
在上两期中我们已经完成了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=$PATHRISCV/bin
二、Building BusyBox
我们目前使用BusyBox开发,这是一组非常有用的实用程序,它们都编译成一个多用途的二进制文件。使得我们使用BusyBox而不需要修改源代码。你可以在https://www.busybox.net上获得源代码。在本例中,我们将使用BusyBox1.26.2,但其他版本应该有也可以正常工作。
目前,我们需要它的程序init和ash,但有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,应该拥有以下几个目录:
l /bin
l /dev
l /etc
l /lib
l /proc
l /sbin
l /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-linux和riscv-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,该命令如下所示:
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
原文:https://blog.csdn.net/l919898756 ... 456?utm_source=copy
相关阅读:
RISC-V Tools编译安装三部曲之一
RISC-V Tools编译安装三部曲之二
RISC-V Tools编译安装三部曲之三 |
|