体験!マイコンボードで組込みLinux

第2回 組込みLinuxが起動するまで

この記事を読むのに必要な時間:およそ 4.5 分

Linux起動の概要

Linux起動前

Linuxでは基本的にシステムの初期設定をするので,Linux以前の状態ではほとんどの初期設定処理は不要です。

Linux以前ではLinuxをロードする対象であるSDRAM領域を初期化する処理は必要となります。一般的な組込みLinuxボードでは大容量フラッシュROM上にLinuxカーネルが書き込まれていることが多いので,RAM領域が使えるようにさえすれば,あとはROM上からRAM上へデータコピーをするだけでLinuxが起動できます。

SH7706LSRボードでは大容量フラッシュROMではなくSDカード上にLinuxカーネルがファイルとして書き込まれていますので,Linux起動以前にSDカードアクセスやファイルシステムの操作ができていないといけません。SH7706LSRボードではSDカードアクセスやファイルシステムの操作が可能なMESというシステムが書き込まれていますので,MESベースでLinuxを起動すればいいわけです。Linux以前の状態ではLinuxカーネルをRAMメモリ上にコピーをして所定の番地にジャンプをして,Linuxを起動します。

初期RAMDISK

Linuxが起動すると,小規模なLinuxファイルシステムである初期RAMDISKベースでミニLinuxシステムが起動します。このミニLinuxシステムでは本稼働のファイルシステムが動作するのに必要な処理が可能になります。環境によっては何もしなくても本稼働のファイルシステムが動作するケースもあります。

たとえば,本稼働のファイルシステムのベースとなるメディアのデバイスドライバがモジュールの場合は,本稼働のファイルシステムが起動する前にミニLinuxシステムでモジュールのロードをします。ネットワークファイルシステムベースの場合は,本稼働のファイルシステムが起動する前にネットワーク通信の設定などを行います。

ミニLinuxシステムの処理は,初期RAMDISKのファイルシステム上のlinuxrcという名称のスクリプトで記述をします。linuxrcのスクリプト処理が終了すると,ファイルシステムがミニLinuxシステムから本稼働のファイルシステムに切り替わり,Linuxの起動となります。

initプロセス

本稼働のファイルシステム上でLinuxが起動すると,まずinitプロセスが起動します。initプロセスは本稼働のファイルシステム上にある/etc/inittabの記述内容に従ってLinuxシステムの初期化処理を実行します。/etc/inittabではランレベルの指定,ブート時の処理スクリプト,ランレベルごとの処理スクリプト,ランレベルごとのログインプロンプトを出すための端末制御などの内容を記述します。

Linuxシステムの初期化処理は,/etc/inittabで指定したブート時の処理スクリプトで具体的に記述をします。初期化が終了すると/etc/inittabで指定されたランレベルに対応した端末処理が起動し,ログインプロンプトが表示されて,Linuxの初期化が終了し,Linuxの通常操作ができるようになります。

組込みLinuxの起動について

PCの場合はLILOやgrubをそのままのかたちで利用すればLinuxが起動できますので,Linux起動についての知識は不要です。組込みボードの場合は,ハードウェアが多種多様なので,標準のLILOやgrubがそのまま使えません。このためLinux起動についての知識や技術開発などが必要になってきます。

組込みボードでのLinux起動へのアプローチには,主に2つの方法があります。1つはLILOやgrubの内部仕様を熟知し,全ソースコードを完全に解読して,対象となる組込みボードに対してLILOやgrubなどを移植する方法です。

もう1つは,白紙の状態からブートローダを自作する方法です。単純な組込みボードではWindowsとLinuxのマルチローダなどは不要であり,たいていの場合はLinuxが起動すれさえばいいケースが多いので,最低限の部分を満たしたブートローダを自作するほうが労力がかからないと思います。

Linuxのロード場所

Linuxの実体は,Linuxカーネルソースをコンパイルしたあとにトップフォルダに生成されるvmlinuxというイメージファイルです。基本的には組込みボードのRAM領域にvmlinuxのイメージをそのままコピーをしてから所定の番地へジャンプをすれば,Linuxが起動します。

まず,vmlinuxを組込みボードのどの番地からコピーしたらいいかということですが,Linuxカーネル再構築時のメニューで先頭番地を指定し,それでコンパイルしたLinuxカーネルを組込みボードのRAM上の指定した番地からコピーをしてから,所定の番地へジャンプする方法があります。また,Linuxカーネル再構築時のメニューで先頭番地を指定しないLinuxカーネルを組込みボードの任意のRAM領域にコピーをして,所定の番地へジャンプする方法もあります。

そうすると,今回の例で取り上げるSHプロセッサは他のプロセッサとは異なり,プログラムのオフセットを自由に設定でき,動的プログラム配置を可能にするセグメントレジスタやベースレジスタがないので,どうやってコンパイル済みのカーネルが任意のメモリアドレスに対応可能なのかという疑問が出てきます。

答えはMMUにあります。前回MMUについて解説したと思いますが,MMUというのはプロセッサの論理的なメモリアドレスとハードウェアの物理的なアドレスの対応を自由自在に変更できるものです。MMUを使えば物理メモリの場所に関係なく論理アドレスを設定できるので,どこのメモリアドレスにあってもいいわけです。

カーネルの物理構造

組込みボード上でLinuxを起動させるローダーを開発する場合は,何よりも対象となるLinuxカーネルの物理構造を把握しなければなりません。Linuxカーネルは単純にコードがベタになっていて先頭にジャンプすればいいというわけではありません。

図1 Linuxカーネルの概要

図1 Linuxカーネルの概要

Linuxカーネルは図1のような構造になっています。Linuxカーネルは市販デバッガでもソースコードデバッグなどができるようにそれ自身ELF形式になっていますので,先頭にはELFヘッダなどが存在します。Linuxカーネルは起動時にパラメータ指定が必須で,その他に自由にオプションが設定できるようにカーネルオプションを指定することができます。

Linuxカーネルは起動時に必須なパラメータ指定はLinuxカーネルの先頭から1000H番地から始まる整数配列に数値を格納し,カーネルオプションはLinuxカーネルの先頭から1100H番地にテキスト形式そのものの内容を格納します。Linuxカーネルの実行コードはLinuxカーネルの先頭の2000H番地から存在し,Linuxカーネルをメモリ上にコピーし,カーネルパラメータやカーネルオプションを設定してから2000H番地にジャンプをします。

これでLinuxカーネルが起動します。

著者プロフィール

みついわゆきお

1986年日立製作所入所,その3年後に自社ワークステーションでの開発業務をきっかけにBSDを経てLinux利用を始める。

1991年日立を退社し,その後,ボランティアでLinux関連ツールの整備と開発しながらWindows否定運動およびLinux普及運動を開始し,Linuxディストリビューション草創期にはPlamoLinuxのメンテナンスにもかかわる。

2001年ごろより非営利ベースでボードコンピュータの開発を開始し,やがて,無償によりハードとソフトを開発したH8マイコンボードの販売を秋月電子にて開始した。

現在,ボードコンピュータ用基本ソフトMES2.5や,SHプロセッサ向けLinuxパッチおよびTOPPERS/JSPパッチを無償で一般に提供しながら,ティーエーシーやエムイーシステムより原価率100%を目標(ただし,販売店の営業・販売費用や開発・製造の際の差損を除く)としたSuperHボードコンピュータを販売中。

また,現在でも頑固にMS社否定及びWindows撲滅運動に邁進中。

コメント

  • 読み取りと書き込み

    コピー&ペーストという表現からも書き込みに「コピー」という表現は不適切です。(コモンセンス云々は言いすぎかもしれませんが)
    他に、「てにおは」の使い方なども読んでいて気になります。以前、ソフトウェアデザインに寄稿された文章ではそういう事は感じなかったのですが。

    Commented : #3  kkmr (2012/05/30, 15:42)

  • Re: コピーって?

    #1 kkmr さんの疑問がよくわからない...
    普通、コピーといったら「読み取り」と「書き込み」の両方があるとおもうのですが、違いますでしょうか?
    この記事の場合だと、コピー元(ROM,Flash,HDD等)から(カーネルイメージを)読み取って、コピー先(RAM)に書き込むという、ごく普通の文章になっていると思います。
    私はこの記事の文章について「コモセンス」(コモンセンスの間違い?)が欠けているとは感じません。

    Commented : #2  k.a. (2012/05/18, 17:03)

  • コピーって?

    普通、読み取りの場合の意味で使うと思いますが、書き込みの場合も「コピー」という言葉を使っておられるようなので、読み手が混乱します。内容はおもしろいのですが文章全般を通してやや「コモセンス」に欠けるように感じられる点が残念で、読み手は内容の理解以前の文書読解レベルでの努力を強いられます。

    Commented : #1  kkmr (2012/05/15, 11:21)

コメントの記入