ARMv8のベアメタル開発環境構築①

# 目的
ARMでのソフトウェア動作を正確に知りたいが、手元に評価ボードがないのでQEMUで代替したい。ホストマシンはwsl上のCentOS7を使用する。

# QEMUのインストール
yumでinstallできるQEMUバージョンは2.0。結構古いので、念のため最新の6.2をソースインストールする。

事前準備としてpython3.6, gcc7.4.0をインストールしておく。ここは割愛。
pythonは.cshrcでpython36をエイリアスしておく。gccは/usr/local/gcc/7.4.0以下にインストールした。

そのほか必要なパッケージを取得する。
```shell
$ sudo yum install glib2-devel.x86_64 pixman-devel ninja-build
```
こちらのサイトを参考にした。
https://wiki.qemu.org/Hosts/Linux#Fedora_Linux_.2F_Debian_GNU_Linux_.2F_Ubuntu_Linux_.2F_Linux_Mint_distributions

そしてQEMUのインストール。かなり時間がかかる。インストール先は/usr/local/qemu/6.2.0とする。
```shell
$ wget https://download.qemu.org/qemu-6.2.0.tar.xz
$ tar xvJf qemu-6.2.0.tar.xz
$ cd qemu-6.2.0
$ ./configure --cc=/usr/local/gcc/7.4.0/bin/gcc --cxx=/usr/local/gcc/7.4.0/bin/g++ --prefix=/usr/local/qemu/6.2.0
$ make
$ sudo make install
```

動作確認。とりあえずインストールはできた。
```shell
$ qemu-system-arm --version
QEMU emulator version 6.2.0
Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers
$ qemu-system-aarch64 --version
QEMU emulator version 6.2.0
Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers
```

# クロスコンパイラのインストール
評価ボードに相当するものが作れたので、続いてソフトウェアを作っていく。クロスコンパイラにはARMのものを使用する。
https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/downloads

最初に参考にするhello world!がarm926用なので32bit,64bit両方をインストールしておく。以下でよいはず。
- AArch32 bare-metal target (arm-none-eabi)
- AArch64 bare-metal target (aarch64-none-elf)

それぞれwget。
```shell
$ wget https://developer.arm.com/-/media/Files/downloads/gnu/11.2-2022.02/binrel/gcc-arm-11.2-2022.02-x86_64-arm-none-eabi.tar.xz
$ wget https://developer.arm.com/-/media/Files/downloads/gnu/11.2-2022.02/binrel/gcc-arm-11.2-2022.02-x86_64-aarch64-none-elf.tar.xz
```

解凍してそれぞれ、
- /usr/local/gcc-arm/11.2-2022.02/arm-none-eabi
- /usr/local/gcc-arm/11/2-2022.02/aarch64-none-elf

に移動。所有者を変えたり、パスを通したり、動作確認。

```shell
$ arm-none-eabi-gcc --version
arm-none-eabi-gcc (GNU Toolchain for the Arm Architecture 11.2-2022.02 (arm-11.14)) 11.2.1 20220111
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ aarch64-none-elf-gcc --version
aarch64-none-elf-gcc (GNU Toolchain for the Arm Architecture 11.2-2022.02 (arm-11.14)) 11.2.1 20220111
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

# Hello world!
以下のサイトを参考にさせてもらって、まずはHello World!を出すことを急ぐ。ターゲットCPUはarm926で環境はversatilepb。
https://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/

用意したのはstartup.s, test.c, test.ld。記述はすべて上記のサイトの通りでそのまま動いた。ありがたい。

```shell
$ arm-none-eabi-as -mcpu=arm926ej-s -g startup.s -o startup.o
$ arm-none-eabi-gcc -c -mcpu=arm926ej-s -g test.c -o test.o
$ arm-none-eabi-ld -T test.ld test.o startup.o -o test.elf
$ arm-none-eabi-objcopy -O binary test.elf test.bin
$ qemu-system-arm -M versatilepb -m 128M -nographic -kernel test.bin
Hello world!
QEMU: Terminated
```
QEMUから抜けるにはctrl+a,x

とりあえず最低限の環境はできた。少しコマンドやスタートアップルーチン周りを解読して、64bit環境にトライしたい。