学校では教えてくれないこと

CPU起動とブートローダ

2013.7

やぁみんな、ビリーだよ。

いつも楽しみにしていてくれる読者のみんな、お待たせしてしまってごめんね。
ボクも忙しくて・・・

さて今回は、コンピュータ機器の電源を入れてからソフトウェアが起動するまでの間にどのような処理が行われているのか、説明しよう。

「行われているのか」と他人事のように聞こえるけど、組み込み機器のソフトウェアプログラマーであれば、このプログラム自体を作らないといけない場面も出てくるんだ(^_^;)。

自社でCPUボードを開発してプログラムを乗せる場合や、市販のボードでlinuxは動作しているがそれは使わずに自社OSを移植する場合などが該当するよ。

電源オンの直後に実行されるプログラム

世の中にはいろんなメーカのCPUがあるけど、基本的にどのようなCPUであっても、電源を入れた直後(またはリセットを行った直後)の処理は決まっていて、以下のいずれかの処理が実行されるようになっているよ。

  1. 電源を入れると、あらかじめ決められているアドレスからプログラムを読み出し、それを実行する。
  2. 電源を入れると、あらかじめ決められているアドレスから「プログラムがどこ(どのアドレス)に置かれているか」を読み出し、そのアドレスからプログラムを読みだして実行する。

どちらの方式になっているか、および「あらかじめ決まったアドレス」が何番地か、というのはCPU それぞれで決まっているよ(しばしば「リセットベクタ」とも呼ばれる)。例えば以下のようになるんだ。

  • 1.のタイプ:Intel x86,Pentium 系、FreeScale PowerPC 系
  • 2.のタイプ:各社 ARM 系、Renesas SH,RX 系

「あらかじめ決まったアドレス」には、通常はフラッシュメモリやROMのような、書き換え可能な不揮発メモリが配置されているよ。つまりCPUの起動プログラムを作ったら、このアドレスに起動プログラムを書き込んでおくことになるんだ。実際に使用する CPU がどちらに属するのかは、CPU のデータシートで「例外処理」「リセット」あたりのキーワードで調べると載っているよ。

CPU起動直後に必要な処理

CPU起動直後には、いろいろなものを初期化する必要があるよ。これはCPUによって異なり、たとえばARM系であってもメーカや型番によって、必要な処理や手順が異なるんだ。一から作るのはなかなか大変だから、そのCPUで動作している他のOSや、なければ類似のCPUのコードを参考に作ろう。一般的には、以下のような初期化処理が必要だよ。

割り込みコントローラの初期化

割り込みをすべて禁止する。プログラムが起動し、割り込みが使えるようになったらその割り込みを許可する。例えばLANを使いたいのであれば、LANのドライバを初期化してから割り込みを許可する、という感じだね。

RAMの初期化

CPUの内蔵RAMであれば初期化なしでそのまま使える場合もあるけど、外付けのRAMであれば通常は何らかの初期化が必要なはずだ。CPUのRAMコントローラのレジスタであったり、RAMの種類によってはRAMの初期化処理が必要(例えば最初に所定のパターンでデータを書き込むなど)だよ。

CPUのモード設定

CPUによってはいろいろな動作モードを持つものがある。Intel x86系であればリアルモード、プロテクトモードがあるよ。

ブートローダって?

プログラムを別々に作る場合で、このうち電源を入れて最初に起動されるプログラムを「ブートローダ」と呼ぶんだ。

わかりやすい例でいうと、Windowsを起動する場合に、まずBIOSが起動し、BIOSがHDDなりDVDからWindows OSを読み出して起動するよね。このBIOSに相当するのがブートローダなんだ。ブートローダでは、先に書いた割り込みコントローラの初期化などを行うけど、Windowsの例だとHDDやDVDドライブを使用できるように初期化する処理なんかも含まれることになるね。

Windowsのような大きなプログラムは FLASHやROMに格納するのは大変なので、「Windowsを起動するプログラム(=BIOS)」を別に作って入れておく、というようなことを行うんだ。組込み機器の世界では、そこまで大きなプログラムではなくて、プログラムが全部FLASHやROMに収まってしまう場合も多く、そのような場合はわざわざブートローダとメインのプログラムを分けずに、ブートローダの機能を含んだ一つのプログラムとして作ってしまう場合もあるよ。

ブートローダをメインのプログラムと分けておく一番のメリットとしては、頻繁に書き換える可能性があるプログラムと、一度書きこんだらその後変更しないプログラムを分離できることなんだ。

ふつう、ブートローダや、ブートローダを使わない場合のプログラムは、FLASHやROMに書き込まれている。これを書き換えるには、ICEやROMプログラマー等の機器が必要なんだ。つまり簡単には書き換えられないよね。

例えば製品を出荷した後でプログラムのバグが見つかり、プログラムをアップデートしないといけないような場合、ブートローダとメインプログラムを分離しておき、メインプログラムはHDDにおいておくとか、FLASHを書き換えるプログラムごと乗せておくとかすれば、わざわざ製品を回収してICEなどで書き換えなくてもよくて、ユーザーにアップデートプログラムを渡して書き換えてもらうことで対応できるよね。

この機能は当社製品のBBsQuestや EcoQuest等にも利用されていて、ファームウェア(メインのプログラム)をHPなりCDなりで提供して、お客様自身で製品のファームウェアを更新もらうようにしているよ。

ビリーに「○○について講義して!」といったリクエストがあれば、お問い合わせから送ってね。お題があれば、そんなにお待たせせずに、次の講義が出来るかも・・・。

ページのトップへ