完全理解! ラズベリー・パイの 32/64ビットLinux起動シーケンス

第1部
第
2章
ご購入はこちら
なるほどそうやって動くのか!
リセット直後から丸はだか!
知って
た
ハナタ ら
カ!
完全理解! ラズベリー・パイの
32/64ビットLinux 起動シーケンス
原山 みや
表 1 ラズベリー・パイ・シリーズの CPU コア
表 2 リセット解除後最初に動くプログラム「ブート・スタブ」は
名 称
プロセッサ
コア名
コア
数
コアの
クロック
周波数
ラズベリー・
パイ
BCM2835
ARM1176JZF-S
1
700MHz
ラズベリー・
パイ 2
BCM2836
Cortex-A7
4
900MHz
ラズベリー・
パイ 3
BCM2837
Cortex-A53
4
1.2GHz
ラズベリー・パイ 3 では,CPU コアが 64 ビット対
応 ARM Cortex-A53 になりました(表 1).当然,搭載
される Linux も 64 ビットだと思っていましたが,な
んと,32 ビット Linux のままでした.
ラ ズ ベ リ ー・ パ イ の エ コ シ ス テ ム を 考 え る と,
Linux を 64 ビットにする必要はなく,Cortex-A53 コ
アをクロック周波数が 900MHz から 1.2GHz になった
高速な 32 ビット ARMv7 コアとして動作させた方が
よいと判断したのでしょう.そうすることで,クロッ
ク周波数が速くなった恩恵を受けて,33%程度の性能
向上が見込めるのですから.
しかし,Cortex-A53 コアを 64 ビットで動かせれば
32 ビットのときよりも Dhrystone 値で 20%程度速く
なります(1).ということは,ラズベリー・パイ 3 で 64
ビット Linux が動けば,ラズベリー・パイ 2(32 ビッ
ト Linux)に対して,60%(= 1.2/0.9 × 1.2)も速くな
ります.ラズベリー・パイ 3 でもっと速くプログラム
を動かすには,64 ビット Linux を動かせればよいので
す.
32 ビット /64 ビット Linux を
使い分ける前に
● リセット後最初に実行されるプログラム
「ブート・スタブ」とは
ラズベリー・パイ /2/3 と各ブート・スタブの対応
を表 2 に示します.CPU コアのアーキテクチャごとに
ブート・スタブがあります.
ここでいうブート・スタブとは,CPU コアのリセッ
2016 年 11 月号
CPU コアのアーキテクチャごとに用意されている
名称
CPU コアの
アーキテクチャ
ビット幅
ソースコード名
ラズベリー・パイ
ARMv6
32 ビット armstub.S
ラズベリー・パイ 2
ARMv7
32 ビット armstub7.S
ラズベリー・パイ 3
ARMv8
32 ビット armstub7.S
64 ビット armstub8.S
トが解除された後に実行される最初のプログラムのテ
ンプレートを考えてよいと思います.テンプレートな
のでこのブート・スタブにコードを追加したり,既に
あるコードを修正したりすることで独自のブート部を
作れるということを意味しています.
Cortex-A53(ARMv8)ですが,32 ビットのときはラ
ズベリー・パイ 2 と同じブート・スタブ(armstub7.
S)を,64 ビットのときは別の新しいブート・スタブ
(armstub8.S)を使います.
ラズベリー・パイ・シリーズの CPU コアのブート
部は,ソースコードが公開されていないブート・プロ
グラムの一部に含まれていて,ユーザがその部分を変
更することができませんでした.しかしラズベリー・
パイの公式ツールの一部としてスタブ・コードが公開
されたことで,ユーザが独自のブート部を作れるよう
になりました.また,最新のブート・プログラムで
は,ラズベリー・パイ /2/3 にあったデフォルトのブー
ト部が組み込まれているようです.
● 32 ビットに 64 ビット…使いたいモード用の
ブート・スタブで起動する
どうすれば,64 ビット Linux が動くかという問いに
対 し て は,armstub8.S を 使 う こ と で,64 ビ ッ ト
Linux を起動することができるようになりました.
「は
い,
これで目的は達成できました.よかったですね?」
Linux 上でアプリケーションを動作させるだけであ
れば,ここまでで終わりです.ブート・スタブの詳細
を知る必要はありません.
しかし,組み込みソフトウェアに本格的に取り組み
37