❄️

nix-shellでRISC-Vの実行環境を用意する方法

2023/10/26に公開

概要

nix-shellでRISC-Vの実行環境を用意する方法 をご紹介します。

RISC-V の実行環境を真正面から構築しようとするとそれなりの手数が掛かりますが、こちらの方法であれば手軽でクリーンに用意できます。

認識が甘い箇所は、ご教示いただけますと幸いです。

動作確認時の環境

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ではなくnativeBuildInputspackages)です。
  • 環境変数「NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM=1」の適用は不要です。
  • riscv-pkとは RISC-V Proxy Kernel and Boot Loaderpk) のことです。
  • Spike RISC-V ISA Simulatorspike)の動作に dtc が必要です。
  • ここではspikeを選択したため QEMUqemu)は宣言していません。

動作確認

以下のサンプル(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 $(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 $(which pk) main
bbl loader
Hello, World!!

参考文献

GitHubで編集を提案

Discussion