RISC-VのLinuxブート環境を構築したので、次にこれをRTL環境で実行している。Linuxカーネルのブートはうまくいきそうなので、次にルートファイルシステムの読み込みに挑戦する。つまりrootfsの構築だ。
まずはSpikeで同じことができる必要がある。Spikeでinitrdをロードするためには以下のコマンドを使用する。
$ spike -m512 --isa=rv64gc --kernel Image --initrd rootfs.cpio fw_jump.elf
HiFiveコンフィグレーションでビルドしたBuildroot Linuxは、以下で固まってしまう。
[ 0.123850] usbhid: USB HID core driver [ 0.124485] NET: Registered protocol family 10 [ 0.125090] Segment Routing with IPv6 [ 0.125345] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver [ 0.125975] NET: Registered protocol family 17 [ 0.126350] 9pnet: Installing 9P2000 support [ 0.126625] Key type dns_resolver registered [ 0.126930] debug_vm_pgtable: [debug_vm_pgtable ]: Validating architecture page table helpers [ 0.127865] Freeing unused kernel memory: 220K [ 0.157280] Run /init as init process Starting syslogd: OK Starting klogd: OK Running sysctl: OK Saving random seed: [ 0.224010] random: dd: uninitialized urandom read (512 bytes read) OK Starting network: Waiting for interface eth0 to appear............... timeout! run-parts: /etc/network/if-pre-up.d/wait_iface: exit status 1 FAIL can't open /dev/ttySIF0: No such file or directory can't open /dev/ttySIF0: No such file or directory can't open /dev/ttySIF0: No such file or directory can't open /dev/ttySIF0: No such file or directory
SpikeコンフィグレーションでビルドしたBuildroot Linuxは、最後まで進むことができる。
[ 0.097635] usbhid: USB HID core driver [ 0.098335] NET: Registered PF_INET6 protocol family [ 0.099145] Segment Routing with IPv6 [ 0.099430] In-situ OAM (IOAM) with IPv6 [ 0.099770] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver [ 0.100575] NET: Registered PF_PACKET protocol family [ 0.101090] 9pnet: Installing 9P2000 support [ 0.101440] Key type dns_resolver registered [ 0.101890] debug_vm_pgtable: [debug_vm_pgtable ]: Validating architecture page table helpers [ 0.103815] Freeing unused kernel image (initmem) memory: 2144K [ 0.112675] Run /init as init process Starting syslogd: OK Starting klogd: OK Running sysctl: OK Saving random seed: [ 0.192880] random: dd: uninitialized urandom read (512 bytes read) OK Starting network: OK Welcome to Buildroot buildroot login:
で、initrdのロード方法なのだが、Spikeの実装を見てみると以下のようになっている。
spike_main/spike.cc
if (initrd && check_file_exists(initrd)) { initrd_size = get_file_size(initrd); for (auto& m : mems) { if (initrd_size && (initrd_size + 0x1000) < m.second->size()) { initrd_end = m.first + m.second->size() - 0x1000; initrd_start = initrd_end - initrd_size; read_file_bytes(initrd, 0, m.second, initrd_start - m.first, initrd_size); break; } } }
これはkernelのロードの方法と全く一緒で、0x1000からロードしている。これは物理アドレスに直すと0x80001000にロードすればいいはずなので、そのようにSoC環境を変更していこう。