RISC-V命令セットの実行環境
RISC-Vのアセンブリコードを実行するためには以下のツールが必要です。
- riscv-gnu-toolchain
RISC-V向けにプログラムをコンパイルするためのGNUツール。
https://github.com/riscv-collab/riscv-gnu-toolchain
ターゲットトリプレット:
https://wiki.osdev.org/Target_Triplet - riscv-isa-sim
spikeというRISC-Vの命令セットシミュレータ。
https://github.com/riscv-software-src/riscv-isa-sim - riscv-pk
spikeでのシミュレーションをサポートするためのプロキシーカーネル。本来OSが担う処理の肩代わりをする。
https://github.com/riscv-software-src/riscv-pk
プロキシーカーネルとは:
https://msyksphinz.hatenablog.com/entry/2018/06/11/040000
これらをビルドする
これらのツールは手動でビルドするので正直めんどうですし、ビルド時間が長いです(特にtoolchain)
めんどうなのでDockerに環境を構築しました
これらのツールをDockerに構築しました。
ちなみにアーキテクチャはRV64G、ABIはLP64Dです。
docker pull reten/riscv_exe:latest
Dockerfile
一応Dockerfileも。
初めてDockerfileを書いたということもあって結構苦戦しました。
オプションでアーキテクチャとABIを指定しないとうまくいきません。(当たり前ですが)
/opt/riscv/にインストールしてますが、ここはどこでも大丈夫です。
prefixとアーキテクチャやABIは自由に変えてください。
参考:
FROM ubuntu:bionic
WORKDIR /app
ENV PATH=$PATH:/opt/riscv/bin
ENV PATH=$PATH:/opt/riscv/spike/bin
ENV HOME=/root
ENV USER=root
ENV TOOL_PATH=/app/riscv-gnu-toolchain/build
ENV SPIKE_PATH=/app/riscv-isa-sim/build
ENV PK_PATH=/app/riscv-pk/build
RUN apt update && \
apt install -y \
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 \
git \
device-tree-compiler \
vim
RUN git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
WORKDIR /app/riscv-gnu-toolchain
WORKDIR $TOOL_PATH
RUN ../configure --prefix=/opt/riscv --with-arch=rv64g --with-abi=lp64d && \
make -j$(nproc)
WORKDIR /app
RUN rm -r riscv-gnu-toolchain && \
git clone https://github.com/riscv/riscv-isa-sim
WORKDIR $SPIKE_PATH
RUN ../configure --prefix=/opt/riscv/spike --with-isa=rv64g && \
make && \
make install
WORKDIR /app
RUN rm -r riscv-isa-sim && \
git clone https://github.com/riscv/riscv-pk
WORKDIR $PK_PATH
RUN ../configure --prefix=/opt/riscv/pk --host=riscv64-unknown-elf --with-arch=rv64g --with-abi=lp64d && \
make && \
make install
WORKDIR /app
COPY script /app/script
RUN rm -r riscv-pk && \
cp script/env.sh /app/.env.sh && echo ". /app/.env.sh" >> ${HOME}/.bashrc
補足:Dockerfileの書き方
余談ですが、Dockerfileの書き方を書いておきます。(ほぼ自分用)
ubuntuのバージョン
https://hub.docker.com/_/ubuntu/tags
Dockerfileベストプラクティス
https://docs.docker.jp/develop/develop-images/dockerfile_best-practices.html#cmd
Dockerfileはcdコマンド、mkdirコマンドが使えません。
ENVで指定したパスをWORKDIRで指定することで、ディレクトリを移動します。
また構築環境内で通したいパスはDockerfileをビルドする際には指定することができません。(Dockerfile内のENVはあくまでもビルドするときに通すパスです)
上記のDockerfileは、containerを起動するときにディレクトリscriptにあるenv.shを実行することでパスを通します。
詳しくは以下のリポジトリを確認してください。
https://github.com/rei0515reten/pointerbook-sample/tree/main/image