一文了解riscv软件系列之linux内核编译运行
创始人
2024-02-10 18:56:12
0

一、交叉编译工具链的安装

【推荐阅读文章】

代码大佬的【Linux内核开发笔记】分享,前人栽树后人乘凉!

一篇长文叙述Linux内核虚拟地址空间的基本概括

一文了解Linux内核的Oops

需要多久才能看完linux内核源码?

详细讲解磁盘及文件系统管理(图例解析)

交叉编译工具链可以通过源码进行编译安装:

1.下载工具链源码: 该仓库包含多个submodules,因此需要添加 --recursive 选项来下载所有子模块的代码

$ git clone --recursive https://github.com/riscv/riscv-gnu-toolchain

或者:

$ git clone https://github.com/riscv/riscv-gnu-toolchain
$ cd riscv-gnu-toolchain
$ git submodule update --init --recursive

2.安装编译依赖

为了编译该工具链,先安装如下工具:

  • Ubuntu:
sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev
  • Fedora/CentOS/RHEL:
 sudo yum install autoconf automake python3 libmpc-devel mpfr-devel gmp-devel gawk  bison flex texinfo patchutils gcc gcc-c++ zlib-devel expat-devel 

3.编译

为了同时支持32位系统和64位系统,我们编译支持两种系统的交叉编译工具链:

$ ./configure --prefix=/opt/riscv --enable-multilib
$ make linux

编译后,我们的交叉编译工具链就被安装到/opt/riscv目录下。工具链的前缀为 riscv64-unknown-linux-gnu-,能同时支持32-bit和64-bit系统。

4.配置工具链的路径

将/opt/riscv添加到系统搜索路径(这里自己去添加,就不演示了)。

为了简便,我们可以使用sifive编译好的交叉编译工具链,直接下载就好:

  • window版本:http://static.dev.sifive.com/dev-tools/r…
  • linux版本(ubuntu):http://static.dev.sifive.com/dev-tools/r…
  • linux版本(centos):http://static.dev.sifive.com/dev-tools/r…

二、编译linux内核

下载linux 5.2.4源码(可以选择其他实现了riscv的内核版本),进入linux内核根目录(以后用'linux-5.2.4$' 作为linux内核根目录的提示符),如下:

 linux-5.2.4$linux-5.2.4$

配置riscv内核选项

  1. 为了配置的方便,我们先试用riscv的默认配置选项,然后再在此基础上进行配置的修改:
linux-5.2.4$ make ARCH=riscv defconfig

执行该命令后,会将 linux-5.2.4/arch/riscv/configs/defconfig拷贝到linux-5.2.4/.config。

2.配置内核选项

linux-5.2.4$ make ARCH=riscv menuconfig

我们不做任何修改直接保存退出,采用系统提供的默认配置。默认采用的是riscv 64位系统配置。

3.编译linux内核

linux-5.2.4$ make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu-

我系统中已经编译制作好riscv的交叉编译工具链,交叉编译工具链的前缀为riscv64-unknown-linux-gnu-,因此,我们在编译riscv64平台的linux内核时,需要添加CROSS_COMPILE=riscv64-unknown-linux-gnu- 选项。

编译完成后,在linux-5.2.4/arch/riscv/boot目录下就能找到编译后的内核镜像,分别为Image和Image.gz

三、根文件系统制作

  1. 下载busybox:

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

  1. 编译riscv版本busybox
  • 解压后,进入busybox根目录进行配置:
busybox-1.26.2$ make menuconfig

在Bosybox Settings 选项下:

勾选上Build BusyBox as a static binary (no shared libs): [*] Build BusyBox as a static binary (no shared libs)

如果选择Build BusyBox as a static binary (no shared libs)方式进行编译时,所需的库已经与程序静态地链接在一起,这些程序不需要额外的库就可以单独运行,但是自己编写的程序在文件系统上运行必须采用静态编译,否则会报诸如:bin/sh: hello :not found的错误。

静态编译如:
riscv64-unknown-linux-gnu-gcc –static hello.c –o hello
配置交叉编译工具链的前缀(riscv64-unknown-linux-gnu-) Cross Compiler prefix:

这里我的工具链前缀为risc64-unknown-linux-gnu-,配置为这个前缀后,在编译时就不用再选择编译平台以及编译的工具链。

  • 编译busybox busybox-1.26.2$ make 编译完成后,生成的文件都在busybox-1.26.2/_install目录下

3.制作根文件系统镜像

  • 先制作128M大小的镜像文件
$ dd if=/dev/zero of=rootfs.img bs=1M count=128 
  • 将镜像文件格式化为ext4文件系统
 $ mkfs.ext4 rootfs.img 
  • 挂载rootfs.img
 $ sudo mount -o loop rootfs.img /mnt
  • 创建文件系统结构
进入/mnt
$ cd /mnt
创建常见文件夹
$ sudo mkdir dev mnt proc var tmp sys root lib

注意: 可能需要改变一下权限才能执行创建文件的操作(mnt默认为root权限)。

拷贝busybox生成的文件到该目录下 busybox生成文件的路径为:/home/caipengxiang/software/linux-kernel/busybox-1.26.2/_install/
$ sudo cp -av /home/caipengxiang/software/linux-kernel/busybox-1.26.2/_install/* ./
将busybox可执行文件生成init软连接
$ sudo ln -s bin/busybox init

执行完以上命令后,/mnt的目录结构如下:

  • 添加配置文件 我们使用busybox提供的example对跟文件系统进行配置
 sudo cp -av /home/caipengxiang/software/linux-kernel/busybox-1.26.2/examples/bootfloppy/etc etc 

修改文件系统挂载配置,修改etc/fstab内容如下:

#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#                
proc            /proc   proc    defaults    0   0
sysfs           /sys    sysfs   defaults    0   0
tmpfs           /var    tmpfs   defaults    0   0
tmpfs           /tmp    tmpfs   defaults    0   0
tmpfs           /dev    tmpfs   defaults    0   0
系统启动参数设置,修改etc/init.d/rcS文件:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
mount -a
mdev -s
  • 卸载rootfs.img
$ sudo umount /mnt

卸载完rootfs.img后,我们的根文件系统镜像文件rootfs.img也就制作完成。

四、qemu模拟器运行linux内核

  1. 当前qemu已支持对riscv的模拟。为了方便,我们直接使用sifive官网提供的qemu模拟器,该模拟器是已经编译好了的压缩包,解压即可使用。

windows版本:http://static.dev.sifive.com/dev-tools/r…
linux版本(ubuntu):http://static.dev.sifive.com/dev-tools/r…
linux版本(centos):http://static.dev.sifive.com/dev-tools/r…

当然,我们也可以直接通过qemu的源码来编译riscv的模拟器,有兴趣的同学可以自己尝试。

2.运行linux

linux-5.2.4$ qemu-system-riscv64 -machine virt -m 256M -nographic -bios default -kernel ./Image -drive file=./rootfs.img,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -append "root=/dev/vda rw console=ttyS0"

运行起来的结果如下(此图时我在windows下运行的截图):

  • qemu 默认支持OpenSBI的bios,该bios会为我们引导内核的加载,-bios default该选项就是使用默认OpenSBI的bios。
  • Image为我们的内核镜像
  • rootfs.img为跟文件系统镜像

结束语

至此:我们就完成了内核的配置,编译,文件系统的编译等工作,并且成功运行了linux系统。

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...