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
- ラズパイにはシリアルポートがないので、デバッグ用に必要になるかも
リンク集
- BareMetalで遊ぶ Raspberry Pi
- ベアメタルの本
- jitomesky/RPi_Micon_C85book
- 対象ハードがRaspberry Pi Type Bなのがつらい
- RASPBERRY PI BARE METAL TUTORIALS
- BrianSidebotham/arm-tutorial-rpi
- しばらく更新されてない
- Bare metal Raspberry Pi 3 tutorials
- ラズパイ3が対象
- ラズパイ3持ちなのでありがたい
- 頻繁に更新されているっぽい
- クロスコンパイル環境の説明もある
- ラズパイ3だと、64bit・マルチコア・GPUということを考えないといけない
- Interfaceの2017年2月号目次
- ラズパイからはじめるARMベアメタル・プログラムという特集があるみたい
- Raspberry Pi 3で64bitベアメタル(bare metal)プログラミング
- 未読
- Raspberry Pi Zero WでベアメタルUART
ビルドめも
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