はじめに
私は、OSの仕組みに興味があり、Raspberry piでとりあえずHDMI出力するところまでやってみようと思いはじめてみました。
ちなみに私はC言語の知識はありますが、OSやハードウェアについてはほとんど無知で調べても書いてある内容が難しくてわからなかったのでこのサイトのレッスンを主に、アセンブリ言語を調べながら一からやってみました。
https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/introduction.html
開発環境
今回Intel CPUのMacbookを使った。
コンパイラは32Bitで開発する場合gcc-arm-embedded、64Bitで開発する場合gcc-aarch64-embeddedをHomebrewでインストールする。
今回は32Bitで開発する。
SDカードの準備
SDカードに必要なファイルは
- ・bootcode.bin
- ブートローダー
- ・config.txt
- Raspberry piの起動の設定をここに書く
- ・start.elf
- ファームウェアファイル(X86でいうBIOSのようなもの)
- ・kernel.img
- 本体プログラム(今回作るプログラム)
なお、bootcode.bin、start.elfの中身は公開されていないので、私はSDカードにRaspberry piの公式のOSを専用ソフトでダウンロードして、そこからbootcode.bin、start.elf以外を全部消してSDカードを使用した。
config.txtはとりあえず空のテキストファイルとして置いておいた。
Raspberry piのブートプロセス
1. Raspberry piの電源を入れるとGPUが動き出す。
2. GPUはSoC内にマスクされているブートローダーを実行。
3. GPUはSDカード内にある2段目ブートローダー(bootcode.bin)を実行。
4. GPUはstart.elfを実行。ここでCPUが起動。
5. CPUがkernel.imgを実行。
Raspberry pi3 model Bの概要
Raspberry pi3 model BはSoC(System on Chip)といい、CPUとGPUが1つのチップに搭載されている。
SoCはBroadcomのBCM2837でARMv8のクアッドコアCortex-A53 CPUを搭載し、GPUはデュアルコアのVideoCore IVが使用されている。
このRaspberry piは32bit、64bitどちらでも使える。
今回は32bitメインで開発する。
Raspberry piの構造
Raspberry piの構造はメモリマップドI/O(MMIO)といい、決められた物理アドレス空間上に周辺機器のレジスタがマッピングされており、そのアドレスに書き込むことで周辺機器のレジスタを操作できるというもの。
最後に
今回はRaspberry piのベアメタルプログラミングについて必要最低限で知っておいた方がいいことをまとめてみました。
次回はLED点灯のプログラムをC言語とARMのアセンブリで書いてみたいと思います。