目次: GCC
昨日の続きです。AArch64(64ビットARM)向けのLinux開発環境を構築しました。使用するツールは下記の通りです。
カーネルのビルドまで終わりましたので、次はルートファイルシステムです。
ルートファイルシステムの構築にはbuildrootを使います(Gitリポジトリへのリンク)。
$ git clone https://git.buildroot.net/buildroot $ cd buildroot $ make menuconfig - Target options ---> Target Architecture (i386) ---> AArch64 (little endian) に変更する - Toolchain ---> Toolchain type (Buildroot toolchain) ---> External toolchainに変更する Toolchain (Linaro AArch64 2018.05) ---> Custom toolchainに変更する () Toolchain path (NEW) /home/username/x-tools/aarch64-unknown-linux-gnuに変更する(チルダ ~ は使えないので、注意) ($(ARCH)-linux) Toolchain prefix aarch64-unknown-linux-gnuに変更する External toolchain gcc version (4.3.x) ---> 8.xに変更する(crosstool-NGの設定と合わせる) External toolchain kernel headers series (2.6.x) ---> 4.16.xに変更する(crosstool-NGの設定と合わせる) External toolchain C library (uClibc/uClibc-ng) ---> glibc/eglibcに変更する(crosstool-NGの設定と合わせる) Toolchain has C++ support? (NEW) 設定する - Filesystem images ---> cpio the root filesystem (for use as an initial RAM filesystem) 設定する $ make /usr/bin/make -j1 O=/home/katsuhiro/share/projects/oss/buildroot/output HOSTCC="/usr/lib/ccache/gcc" HOSTCXX="/usr/lib/ccache/g++" silentoldconfig ...(snip)...
マシン性能によりますが、ほぼbusyboxしかビルドしませんので、カーネルよりは短い時間で終わるはずです。生成されたファイルはoutputディレクトリに集められています。output以下は下記のようになっているはずです。
$ ls output build host images staging target $ ls output/images/ rootfs.cpio rootfs.tar
ディレクトリには2つファイルがありますが、cpioフォーマットの方(rootfs.cpio)を使います。
エミュレータはqemu(Gitリポジトリへのリンク)を使います。qemuのビルドは後回しにして、とりあえず今までビルドしてきたカーネル+ルートファイルシステムを実行してみます。
Debianの場合はapt-get install qemu-systemでインストール可能です。
$ qemu-system-aarch64 -machine virt -cpu cortex-a57 -kernel linux-next/arch/arm64/boot/Image -initrd buildroot/output/images/rootfs.cpio -serial stdio [ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x411fd070] [ 0.000000] Linux version 4.18.0-rc4-next-20180713 (katsuhiro@blackbird) (gcc version 8.1.0 (crosstool-NG 1.23.0.418-d590)) #1 SMP PREEMPT Mon Jul 16 14:38:51 JST 2018 [ 0.000000] Machine model: linux,dummy-virt [ 0.000000] efi: Getting EFI parameters from FDT: [ 0.000000] efi: UEFI not found. ...(snip)... [ 3.409356] ALSA device list: [ 3.410631] No soundcards found. [ 3.419281] uart-pl011 9000000.pl011: no DMA platform data [ 3.534574] Freeing unused kernel memory: 1344K Starting logging: OK Initializing random number generator... [ 5.446846] random: dd: uninitialized urandom read (512 bytes read) done. Starting network: OK Welcome to Buildroot buildroot login: root # uname -a Linux buildroot 4.18.0-rc4-next-20180713 #1 SMP PREEMPT Mon Jul 16 14:38:51 JST 2018 aarch64 GNU/Linux
オプションでハマったのは -cpu cortex-a57です。省略するとAArch64に対応していないCPUがデフォルトで選ばれるようで、全く動かないです。明示的にARMv8のCPUを指定してください。また -serial stdioを付けないと、シリアルが出力されません。
このときinitramfsを指定し忘れると、起動はしますが下記のようなメッセージを表示して停止します。
$ qemu-system-aarch64 -machine virt -cpu cortex-a57 -kernel linux-next/arch/arm64/boot/Image -serial stdio [ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x411fd070] [ 0.000000] Linux version 4.18.0-rc4-next-20180713 (katsuhiro@blackbird) (gcc version 8.1.0 (crosstool-NG 1.23.0.418-d590)) #1 SMP PREEMPT Mon Jul 16 14:38:51 JST 2018 [ 0.000000] Machine model: linux,dummy-virt ...(snip)... [ 2.777433] ALSA device list: [ 2.777760] No soundcards found. [ 2.785662] uart-pl011 9000000.pl011: no DMA platform data [ 2.793530] VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6 [ 2.794033] Please append a correct "root=" boot option; here are the available partitions: [ 2.794757] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) [ 2.796280] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.18.0-rc4-next-20180713 #1 [ 2.796760] Hardware name: linux,dummy-virt (DT) [ 2.797221] Call trace: [ 2.797472] dump_backtrace+0x0/0x148 [ 2.797837] show_stack+0x14/0x20 [ 2.798087] dump_stack+0x90/0xb4 [ 2.798352] panic+0x120/0x27c [ 2.798577] mount_block_root+0x1a0/0x250 [ 2.798875] mount_root+0x11c/0x148 [ 2.799126] prepare_namespace+0x128/0x16c [ 2.799423] kernel_init_freeable+0x208/0x228 [ 2.799732] kernel_init+0x10/0x100 [ 2.800005] ret_from_fork+0x10/0x18 [ 2.800694] Kernel Offset: disabled [ 2.801107] CPU features: 0x21806082 [ 2.801400] Memory Limit: none [ 2.802136] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) ]---
このようにmount_rootでpanicする場合は、qemuの -initrdオプションか、指定しているファイルをご確認ください。
< | 2018 | > | ||||
<< | < | 07 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
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 |
29 | 30 | 31 | - | - | - | - |
合計:
本日:
管理者: 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.)