X2W-OS Installation#

本文介绍如何安装 X2W-OS的开发环境,从而开始开发 X2W-OS

X2W-OS在开发过程中所使用的工具有:

  • 针对 RISC-VGNU-Toolchain

    • gcc编译器

    • as汇编器

    • ld链接器

    • GDB调试器

    • objdump目标文件信息查看器

    • ……

  • QEMU模拟器

  • MAKE构建工具

  • SphinxDoxygen文档生成工具

教程有诸多不完善之处,敬请谅解

目前教程仅包括从源码安装这一方式,从包管理器安装预编译的工具链的教程后续会添加

GNU-Toolchain#

GNU-Toolchain是一个包含了 GCC编译器、AS汇编器、ld链接器等诸多工具在内的工具集合。

其主要功能为:

  • 将源代码编译称为目标文件、可执行文件等二进制文件(GCCASld……)

  • 对二进制文件进行处理的工具(objdumpobjcopynm……)

  • 调试器(GDB

  • ……

可以说,GNU-Toolchain是进行诸如嵌入式开发、系统开发等地底层开发所必须的工具链。

下载GNU-Toolchain#

GNU-Toolchain可以分为三部分:

  • 编译工具:GCCASLD

  • 二进制文件处理工具:objcopyobjdump……

  • 调试器:GDB

因此在安装的时候需要分别下载这三大类工具的源代码,进行编译。

幸运的是 RISC-V基金会将所有工具的 Git仓库以子模块的形式集合到了一个 Git仓库中。因此利用 Git 即可下载所有的工具的源代码。

首先下载提供了一键化安装 MakefileRISCV-GNU-Toolchain

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

然后下载所有工具源代码。由于 QEMUGit仓库的子模块非常多,因此稍后直接下载压缩包,这里不使用 Git下载 QEMU

cd <path-to-riscv-gnu-toolchain>
git submodule init
git -c submodule.qemu.update=none submodule update --recursive

其中:

  • --recursive选项会对所有的子模块进行下载

如果因为网络问题导致 git clone失败,则可以考虑使用如下的命令为命令行开启代理。

export http_proxy="http://127.0.0.1:<port>"
export https_proxy="https://127.0.0.1:<port>"
alias set_proxy='export http_proxy="http://127.0.0.1:<port>"; export https_proxy="https://127.0.0.1:<port>"'
alias unset_proxy='unset -v http_proxy; unset -v https_proxy'

注意,将 <port>更换为你所使用的工具在本机的端口号

安装GNU-Toolchain依赖#

编译 GNU-Toolchain会依赖一些工具,在不同的系统上使用对应的的命令安装这些依赖

  • Ubuntu/Debian

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 ninja-build
  • Fedora/CentOS/RHEL OS

sudo yum install autoconf automake python3 libmpc-devel mpfr-devel gmp-devel gawk  bison flex texinfo patchutils gcc gcc-c++ zlib-devel expat-devel
  • Arch Linux

sudo pacman -Syyu autoconf automake curl python3 libmpc mpfr gmp gawk base-devel bison flex texinfo gperf libtool patchutils bc zlib expat
  • MacOS

brew install python3 gawk gnu-sed gmp mpfr libmpc isl zlib expat texinfo flock

编译GNU-Toolchain#

使用如下命令编译针对 RISC-VGNU-Toolchain

export PREFIX="~/opt/riscv-tools"
mkdir -p $PREFIX
cd <path-to-riscv-gnu-toolchain>
./configure --prefix=$PREFIX --enable-gdb  --enable-gcc-checkin
make -j

你也可以修改变量 PREFIX的值来更改 RISCV-GNU-Toolchain的安装位置

编译过程中会自动安装编译得到的工具到指定的路径,编译完成后,在安装位置中可以看到所有的工具:

tree -d -L 2 $PREFIX
/Users/jack/opt/riscv-tools/
├── bin
├── include
├── lib
│   ├── bfd-plugins
│   └── gcc
├── libexec
│   └── gcc
├── riscv64-unknown-elf
│   ├── bin
│   ├── include
│   └── lib
└── share
    ├── gcc-12.2.0
    ├── info
    ├── locale
    └── man


16 directories

其中,bin文件夹下存放所有的工具:

ls -l $PREFIX/bin
.rwxr-xr-x@ 1.1M jack  7 Apr 19:17 riscv64-unknown-elf-addr2line
.rwxr-xr-x@ 1.1M jack  7 Apr 19:17 riscv64-unknown-elf-ar
.rwxr-xr-x@ 1.6M jack  7 Apr 19:17 riscv64-unknown-elf-as
.rwxr-xr-x@ 1.4M jack  7 Apr 19:21 riscv64-unknown-elf-c++
.rwxr-xr-x@ 1.1M jack  7 Apr 19:17 riscv64-unknown-elf-c++filt
.rwxr-xr-x@ 1.4M jack  7 Apr 19:21 riscv64-unknown-elf-cpp
.rwxr-xr-x@ 108k jack  7 Apr 19:17 riscv64-unknown-elf-elfedit
.rwxr-xr-x@ 1.4M jack  7 Apr 19:21 riscv64-unknown-elf-g++
.rwxr-xr-x@ 1.4M jack  7 Apr 19:21 riscv64-unknown-elf-gcc
.rwxr-xr-x@ 1.4M jack  7 Apr 19:21 riscv64-unknown-elf-gcc-12.2.0
.rwxr-xr-x@  64k jack  7 Apr 19:21 riscv64-unknown-elf-gcc-ar
.rwxr-xr-x@  65k jack  7 Apr 19:21 riscv64-unknown-elf-gcc-nm
.rwxr-xr-x@  65k jack  7 Apr 19:21 riscv64-unknown-elf-gcc-ranlib
.rwxr-xr-x@ 778k jack  7 Apr 19:21 riscv64-unknown-elf-gcov
.rwxr-xr-x@ 644k jack  7 Apr 19:21 riscv64-unknown-elf-gcov-dump
.rwxr-xr-x@ 672k jack  7 Apr 19:21 riscv64-unknown-elf-gcov-tool
.rwxr-xr-x@ 1.2M jack  7 Apr 19:17 riscv64-unknown-elf-gprof
.rwxr-xr-x@ 2.0M jack  7 Apr 19:17 riscv64-unknown-elf-ld
.rwxr-xr-x@ 2.0M jack  7 Apr 19:17 riscv64-unknown-elf-ld.bfd
.rwxr-xr-x@  23M jack  7 Apr 19:21 riscv64-unknown-elf-lto-dump
.rwxr-xr-x@ 1.1M jack  7 Apr 19:17 riscv64-unknown-elf-nm
.rwxr-xr-x@ 1.2M jack  7 Apr 19:17 riscv64-unknown-elf-objcopy
.rwxr-xr-x@ 1.9M jack  7 Apr 19:17 riscv64-unknown-elf-objdump
.rwxr-xr-x@ 1.1M jack  7 Apr 19:17 riscv64-unknown-elf-ranlib
.rwxr-xr-x@ 1.1M jack  7 Apr 19:17 riscv64-unknown-elf-readelf
.rwxr-xr-x@ 1.1M jack  7 Apr 19:17 riscv64-unknown-elf-size
.rwxr-xr-x@ 1.1M jack  7 Apr 19:17 riscv64-unknown-elf-strings
.rwxr-xr-x@ 1.2M jack  7 Apr 19:17 riscv64-unknown-elf-strip

增加Tab补全#

最后,将 bin文件夹添加到 PATH环境变量中,以实现 Tab补全支持。

  • bash

printf 'PATH=$PATH:%s' $PREFIX/bin >> ~/.bashrc
  • zsh

printf 'PATH=$PATH:%s' $PREFIX/bin >> ~/.zshrc

重新加载 Shell配置文件即可实现 Tab补全

  • bash

source ~/.bashrc
  • zsh

source ~/.zshrc

QEMU#

QEMU用于模拟一个 RISC-V开发板,以测试、运行 X2W-OS

截止目前为止,QEMUMac上的编译并没有通过,但是通过 brew却可以安装 7.1.0版本的 QEMU

因此下文只介绍如何在 Ubuntu等平台上安装 QEMU

下载QEMU#

Git克隆 QEMUGit仓库比较慢,所以直接使用 wget下载 QEMU的压缩包代码。

wget https://download.qemu.org/qemu-7.2.0.tar.xz
tar xvJf qemu-7.2.0.tar.xz

如果因为网络问题导致下载失败,请参考上面的建议

安装QEMU依赖#

编译 QEMU时会依赖一些程序,因此先安装这些依赖

sudo apt install 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 git libglib2.0-dev libfdt-dev libpixman-1-dev libncurses5-dev libncursesw5-dev

编译QEMU#

使用下述命令编译 QEMU

cd qemu-7.2.0
export PREFIX='~/opt/qemu'
./configure --prefix=$PREFIX --target-list=riscv64-softmmu,riscv64-linux-user
make -j

你也可以修改变量 PREFIX的值来更改 QEMU的安装位置

安装QEMU#

编译完成后,将得到的 QEMU程序安装到指定位置

make install

而后就能看到 QEMU的工具:

tree -d -L 2 $PREIFX
/home/jack/opt/qemu
├── bin
├── bin-back
├── include
├── libexec
├── log
├── share
│   ├── applications
│   ├── doc
│   ├── icons
│   ├── man
│   └── qemu
└── var
    └── run

13 directories

其中,bin文件夹下存放所有的工具:

ls -l $PREFIX/bin
-rwxr-xr-x 1 jack jack  2644160 Apr  8 00:33 qemu-edid
-rwxr-xr-x 1 jack jack  3754864 Apr  8 00:33 qemu-ga
-rwxr-xr-x 1 jack jack 10605752 Apr  8 00:33 qemu-img
-rwxr-xr-x 1 jack jack 10402296 Apr  8 00:33 qemu-io
-rwxr-xr-x 1 jack jack 11433864 Apr  8 00:33 qemu-nbd
-rwxr-xr-x 1 jack jack  4050608 Apr  8 00:33 qemu-pr-helper
-rwxr-xr-x 1 jack jack 16419640 Apr  8 00:33 qemu-riscv64
-rwxr-xr-x 1 jack jack 13466608 Apr  8 00:33 qemu-storage-daemon
-rwxr-xr-x 1 jack jack 57615088 Apr  8 00:33 qemu-system-riscv64

增加Tab补全#

最后,将 bin文件夹添加到 PATH环境变量中,以实现 Tab补全支持。

  • bash

printf 'PATH=$PATH:%s' $PREFIX/bin >> ~/.bashrc
  • zsh

printf 'PATH=$PATH:%s' $PREFIX/bin >> ~/.zshrc

重新加载 Shell配置文件即可实现 Tab补全

  • bash

source ~/.bashrc
  • zsh

source ~/.zshrc

GDB#

针对不同的平台,GDB有不同的版本。

Debian/Ubuntu#

使用 apt直接安装

sudo apt-get install gdb-multiarch

而后输入下述即命令可使用针对 RISC-VGDB

gdb-multiarch

MacOS#

使用 brew安装

brew tap riscv/riscv
brew install riscv-tools

而后输入下述即命令可使用针对 RISC-VGDB

riscv64-unknown-elf-gdb