目次: GCC
以前AArch64向けに開発環境を構築しました(その1、その2)。今回は流行りのRISC-Vに対して作成してみます。
全く違うアーキテクチャですが、AArch64向けと同じツール、ほぼ同じ手順が使えます。ツールを整備してくれた開発者の皆様には感謝の極みです。
さっと動かしてみたかったので、前回との変化点としてはbuildrootを使わず、busyboxのみの最小環境を作成しています。buildrootは後日チャレンジしたいと思います。
Crosstool-NGのct-ngのビルド方法は前回と全く同じ(2018年7月15日の日記を参照)なので、割愛します。
$ ./ct-ng menuconfig - Paths and misc options ---> [ ] Try features marked as EXPERIMENTAL 選択する - Target options ---> Target Architecture (alpha) ---> riscvに変更する [ ] Use the MMU 選択する Bitness: (32-bit) ---> 64-bitに変更する - Operating System ---> Target OS (bare-metal) ---> linuxに変更する - C-library ---> C library (musl) ---> glibcに変更する $ ./ct-ng build [00:34] /
設定もAArch64のときと大体同じですが、大きな違いはEXPERIMENTALを有効にする点です。通常はTarget Architectureの選択肢にRISC-Vが存在しません。
また、現時点だと32bit版はビルドエラーになるようなので、64bit版を選択しています。
AArch64のビルドとほぼ同じです。
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git $ cd linux-next $ export ARCH=riscv $ export CROSS_COMPILE=riscv64-unknown-linux-gnu- $ make defconfig $ make all
ビルドが成功するとソースコードのトップディレクトリにvmlinuxが生成されるはずです。
AArch64ではqemuの -kernelオプションにImageファイルを渡せば起動しましたが、RISC-VではImageファイルを渡してもエラーになり起動しません。
調べてみると、qemuでRISC-V向けのLinuxを動作させるには、Imageではなくブートローダ付きのvmlinuxを渡してあげる必要があるみたいです。
$ git clone https://github.com/riscv/riscv-pk $ cd riscv-pk $ mkdir build $ cd build $ ../configure --enable-logo --host=riscv64-unknown-linux-gnu --with-payload=../linux-next-riscv/vmlinux $ make
成功するとbuildディレクトリの下にbblという名前のファイルができます。これがブートローダ+カーネルのバイナリです。bblはBerkeley Boot Loaderの略です。
このリポジトリの名前pkはProxy Kernelの略で、RISC-Vのプロセッサ開発を行う際に、周辺のハードウェアを作り込む代わりに、ホストのシステムコールを呼び便利な実行環境を提供するためのソフトウェアのようです。
プロキシカーネルに用事はないんですけど、付属品のブートローダに用事があります。
このriscv-pkはビルドシステムがちょっとイマイチで、buildディレクトリを作らずにconfigureやmakeをすると、ソースコードの入っているpkディレクトリが吹っ飛びます。ご注意ください……。
以前はbuildrootを使って全自動でinitramfsを生成してもらいましたが、今回は趣向を変えまして、手動でinitramfsを作ります。
$ git clone https://git.busybox.net/busybox $ cd busybox $ export CROSS_COMPILE=riscv64-unknown-linux-gnu- $ make menuconfig - Settings ---> [ ] Build static binary (no shared libs) (NEW) $ make
ビルドに成功するとbusyboxという実行ファイルが生成されるはずです。
次にinitramfsを作成します。基本的な流れはディレクトリに必要なファイルを配置し、cpioで固めるだけです。
$ mkdir initramfs-work-riscv $ mkdir initramfs-work-riscv/root $ cd initramfs-work-riscv/root $ mkdir bin $ cp ../../busybox/busybox bin/ $ ln -s busybox bin/sh $ ln -s bin/busybox init $ mkdir dev $ sudo cp -a /dev/tty* dev/ $ find . | cpio --format=newc -o > ../initramfs.cpio
本来はinit, sh以外のシンボリックリンクも作った方が良いです。このあと、qemuで動かしてみたらわかりますが、すごく不便です。/dev/ttyも横着してホストマシンのデバイスファイルをコピーするのではなく、mkdevで作るべきです。
が、しかし、美しいinitramfsは次回トライするbuildrootにお任せしましょう。今回は適当なまま行きます。
実行する設定はAArch64とは違います。qemuの引数は多すぎるし難しすぎるので、全く覚えられません。私の場合は、動かすたびにわからなくなるので、調べることが多いです。
$ qemu-system-riscv64 -machine virt -kernel riscv-pk/build/bbl -initrd initramfs-work-riscv/initramfs.cpio -serial stdio bbl loader vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv vvvvvvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvv rr vvvvvvvvvvvvvvvvvvvvvv rr vvvvvvvvvvvvvvvvvvvvvvvv rr rrrr vvvvvvvvvvvvvvvvvvvvvvvvvv rrrr rrrrrr vvvvvvvvvvvvvvvvvvvvvv rrrrrr rrrrrrrr vvvvvvvvvvvvvvvvvv rrrrrrrr rrrrrrrrrr vvvvvvvvvvvvvv rrrrrrrrrr rrrrrrrrrrrr vvvvvvvvvv rrrrrrrrrrrr rrrrrrrrrrrrrr vvvvvv rrrrrrrrrrrrrr rrrrrrrrrrrrrrrr vv rrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrrrrrr INSTRUCTION SETS WANT TO BE FREE [ 0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80200000 [ 0.000000] No DTB passed to the kernel [ 0.000000] Linux version 5.0.0-rc7-next-20190225 (katsuhiro@blackbird) (gcc version 8.2.0 (crosstool-NG 1.23.0.610-db4fdf0)) #2 SMP Tue Feb 26 19:07:38 JST 2019 [ 0.000000] Initial ramdisk at: 0x(____ptrval____) (1691648 bytes) [ 0.000000] Zone ranges: [ 0.000000] DMA32 [mem 0x0000000080200000-0x0000000087ffffff] [ 0.000000] Normal empty [ 0.000000] Movable zone start for each node ... [ 0.346331] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver [ 0.348500] NET: Registered protocol family 17 [ 0.349051] Key type dns_resolver registered [ 0.370752] Freeing unused kernel memory: 192K [ 0.370952] This architecture does not have kernel memory protection. [ 0.371164] Run /init as init process can't run '/etc/init.d/rcS': No such file or directory Please press Enter to activate this console. / # ls -/bin/sh: ls: not found / # busybox uname -a Linux (none) 5.0.0-rc7-next-20190225 #2 SMP Tue Feb 26 19:07:38 JST 2019 riscv64 GNU/Linux
無事Linuxの起動画面を拝めました。良かった良かった。
< | 2019 | > | ||||
<< | < | 02 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | - | - | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | - | - |
合計:
本日:
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2023.
Powered by PHP 8.2.15.
using GD bundled (2.1.0 compatible)(png support.)