❄️
nix-shellでRISC-Vの実行環境を用意する方法
概要
nix-shellでRISC-Vの実行環境を用意する方法 をご紹介します。
RISC-V の実行環境を真正面から構築しようとするとそれなりの手数が掛かりますが、こちらの方法であれば手軽でクリーンに用意できます。
認識が甘い箇所は、ご教示いただけますと幸いです。
動作確認時の環境
-
インテル® Core™ i7-2640M プロセッサー
$ uname -m x86_64 $ getconf LONG_BIT 64
- NixOS 23.11
- nix-shell 2.17.1
nix-shellでRISC-Vの実行環境を用意する方法
以下のようなshell.nix
を用意し、nix-shell を実行するだけです。
let
pkgs = import <nixpkgs> {};
in
pkgs.pkgsCross.riscv64-embedded.mkShell {
nativeBuildInputs = with pkgs; [
dtc
pkgsCross.riscv64.riscv-pk
spike
];
}
上記の通りですが一応、補足します。
-
buildInputs
ではなくnativeBuildInputs
(packages
)です。 - 環境変数「
NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM=1
」の適用は不要です。 -
riscv-pk
とは RISC-V Proxy Kernel and Boot Loader(pk
) のことです。 -
Spike RISC-V ISA Simulator(
spike
)の動作に dtc が必要です。 - ここでは
spike
を選択したため QEMU(qemu
)は宣言していません。
動作確認
以下のサンプル(main.c
)を用意し、簡易的に 動作確認 をしてみます。
#include <stdio.h>
int main(void)
{
printf("Hello, World!!\n");
return 0;
}
⚠️
- 上から順に実行を想定していますが、全てを試す必要はございません。
- 以下、riscv64-none-elf-gcc はご使用の環境に読み替えてください。
-
main.c
のコンパイル(リンクまで)を行う。
$ riscv64-none-elf-gcc -o main main.c
$ ls
main main.c
-
Spike RISC-V ISA Simulator(
spike
) で実行する。
$ spike $(which pk) main
bbl loader
Hello, World!!
# 当然、直接実行するとエラーになる。
$ ./main
bash: ./main: cannot execute binary file: Exec format error
-
main.c
のコンパイル(アセンブリ言語に変換)を行う。(main.s
)
$ riscv64-none-elf-gcc -S main.c
$ less main.s
.file "main.c"
.option nopic
...
-
main.s
のアセンブルを行う。(main.o
)
$ riscv64-none-elf-gcc -c main.s
-
main.o
の逆アセンブルを行う。
$ riscv64-none-elf-objdump -d main.o | less
main.o: file format elf64-littleriscv
Disassembly of section .text:
0000000000000000 <main>:
0: 1141 add sp,sp,-16
...
-
main.o
のリンクを行う。
$ riscv64-none-elf-gcc -o main main.o
$ ls -l main
.rwxr-xr-x user users 190 KB Thu Oct 26 20:50:30 2023 main
-
Spike RISC-V ISA Simulator(
spike
) で実行する。
$ spike $(which pk) main
bbl loader
Hello, World!!
Discussion