MEMO_akimach - TochigiRaspberryPICircle/bm GitHub Wiki

akimachのメモ

遊んでみたいこと

  • 割り込みの仕組み
  • メモリマップドI/O
  • ブートローダの仕組み
  • ELFの仕組み
  • リンカスクリプトの書き方
  • libcの再実装
  • マルチコアプログラミング
  • ARMのアセンブリ言語
  • QEMU/エミュレータの使い方
  • gcc/binutilの使い方
  • make/cmakeの書き方

環境構築

Virtual Box / Vagrant / Dockerを使ってローカル環境を汚さずに開発環境を作りたい。

クロスコンパイラのツール

  • gcc
    • お馴染みのコンパイラ
    • ARM向けにツールをビルドする必要あり
  • binutil
    • ldやobjcopyのツールはこれについてくる
  • qemu
    • オプション
    • エミュレータ

必要になりそうな機材

  • USBシリアル変換ケーブル
    • adafruit, switch-science
    • ラズパイにはシリアルポートがないので、デバッグ用に必要になるかも

リンク集

ビルドめも

Bare metal Raspberry Pi 3 tutorialsを参考にトライ。ところどころ動くように修正した。ビルド時にislのシンボリックリンクのパスを見てくれなくて躓いた。

環境

再現した環境。多分Virtual Box上でも動くと思う。

  • Ubuntu 17.10 on Parallels Desktop

ダウンロード

sudo apt update
sudo apt upgrade
sudo apt-get install build-essential git
$ mkdir crosscompiler
$ cd crosscompiler
$ wget http://ftp.jaist.ac.jp/pub/GNU/binutils/binutils-2.29.tar.gz
$ wget http://ftpmirror.gnu.org/gcc/gcc-7.2.0/gcc-7.2.0.tar.gz
$ wget http://ftp.jaist.ac.jp/pub/GNU/mpfr/mpfr-4.0.0.tar.gz
$ wget http://ftp.jaist.ac.jp/pub/GNU/gmp/gmp-6.1.2.tar.xz
$ wget http://ftp.jaist.ac.jp/pub/GNU/mpc/mpc-1.1.0.tar.gz
$ wget ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2
$ wget ftp://gcc.gnu.org/pub/gcc/infrastructure/cloog-0.18.1.tar.gz
$ for i in *.tar.gz; do tar -xzf $i; done
$ for i in *.tar.bz2; do tar -xjf $i; done

isl (integer set library)はスルーしても良いみたいだ。

シンボリックリンクの作成

cd gcc-7.2.0/
ln -s ../mpfr-4.0.0 mpfr
ln -s ../gmp-6.1.2 gmp
ln -s ../mpc-1.1.0 mpc
ln -s ../cloog-0.18.1 cloog

パスの設定

$ echo "export PATH=/usr/local/cross-compiler/bin:$PATH" >> ~/.bashrc

binutilのビルド

$ cd binutils-2.29/
$ ./configure --prefix=/usr/local/cross-compiler --target=aarch64-elf --enable-shared --enable-threads=posix --enable-libmpx --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-plugin --disable-linker-build-id --enable-lto --enable-install-libiberty --with-linker-hash-style=gnu --with-gnu-ld--enable-gnu-indirect-function --disable-multilib --disable-werror --enable-checking=release --enable-default-pie --enable-default-ssp --enable-gnu-unique-object
$ make -j4
$ sudo make install

GCCのビルド

$ ./configure --prefix=/usr/local/cross-compiler --target=aarch64-elf --enable-languages=c --enable-shared --enable-threads=posix --enable-libmpx --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-plugin --disable-linker-build-id --enable-lto --enable-install-libiberty --with-linker-hash-style=gnu --with-gnu-ld--enable-gnu-indirect-function --disable-multilib --disable-werror --enable-checking=release --enable-default-pie --enable-default-ssp --enable-gnu-unique-object
$ make -j4 all-gcc
$ sudo make install-gcc

結果

$ ls /usr/local/cross-compiler/bin
aarch64-elf-addr2line  aarch64-elf-elfedit    aarch64-elf-gcc-ranlib  aarch64-elf-ld       aarch64-elf-ranlib
aarch64-elf-ar         aarch64-elf-gcc        aarch64-elf-gcov        aarch64-elf-ld.bfd   aarch64-elf-readelf
aarch64-elf-as         aarch64-elf-gcc-7.2.0  aarch64-elf-gcov-dump   aarch64-elf-nm       aarch64-elf-size
aarch64-elf-c++filt    aarch64-elf-gcc-ar     aarch64-elf-gcov-tool   aarch64-elf-objcopy  aarch64-elf-strings
aarch64-elf-cpp        aarch64-elf-gcc-nm     aarch64-elf-gprof       aarch64-elf-objdump  aarch64-elf-strip

QEMUのインストール

./configure時に、ログを吐いてくれるのでそれに従って色々とインストール。

$ sudo apt-get install qemu qemu-user-static
$ sudo apt-get install git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev python pkg-config libglib2.0-dev zlib1g-dev libfdt-dev libpixman-1-dev
$ git clone https://github.com/bztsrc/qemu-raspi3.git
$ cd qemu-raspi3
$ ./configure --target-list=aarch64-softmmu,aarch64-linux-user --enable-modules --enable-tcg-interpreter --enable-debug-tcg --python=/usr/bin/python2.7
$ make -j4
$ sudo make install

2018-04-01

2018-06-11

シリアルコンソール接続

screen /dev/tty.SLAB_USBtoUART 115200
  • 接続解除 : ctrl+a d