ARM Linux のブート ================== 著者: Russell King 日付: 2002 年 5 月 18 日 下記の文書は 2.4.18-rmk6 以降に関係します。 ARM Linux をブートさせるためには、メインカーネルより先に動く小さなプログラム であるブートローダが必要になります。ブートローダは、各種デバイスを初期化し、 カーネルに情報を渡して、最終的に Linux カーネルを呼び出すことを求められて います。 基本的に、ブートローダは (少なくとも) 下記の機能を提供する必要があります。 1. RAM のセットアップと初期化 2. シリアルポートを一つ初期化 3. マシンタイプの検出 4. カーネルタグ付きリストのセットアップ 5. カーネルイメージの呼出し 1.RAM のセットアップと初期化 ---------------------------- 既存のブートローダ: 必須 新しいブートローダ: 必須 ブートローダは、システム内の揮発データ格納領域としてカーネルが使用する全ての RAM を見つけ、初期化することを求められています。これはマシン依存の方法でおこ なわれます。(全ての RAM の位置とサイズを自動的に求める内部アルゴリズムが使わ れるかもしれませんし、当該マシンの RAM に関する事前知識やブートローダの設計 者がうまくいくだろうと考えたその他の方法が使われるかもしれません。) 2. シリアルポートを一つ初期化 ----------------------------- 既存のブートローダ: 任意、推奨 新しいブートローダ: 任意、推奨 ブートローダは、ターゲットのシリアルポートを一つ初期化し、有効にしておくべき でしょう。これにより、カーネルシリアルドライバが、カーネルコンソールとして 使用すべきシリアルポートを自動検出できるようになります (一般的には、デバッグや ターゲットとの通信のために使用されます。) 他の選択肢としては、ポートおよび下記の文書で説明されているシリアルフォーマット オプションをタグ付きリストに指定することにより、関連する `console=' オプション をブートローダからカーネルに渡すことができます。 linux/Documentation/kernel-parameters.txt. 3. マシンタイプの検出 --------------------- 既存のブートローダ: 任意 新しいブートローダ: 必須 ブートローダは、自らが動作しているマシンのタイプを何らかの方法で検出する必要が あります。それがハードコーディングされた値なのか、それとも接続されたハードウェア を調べる何かしらのアルゴリズムなのか、という点については、この文書の範囲外です。 ブートローダは、最終的には MACH_TYPE_xxx という値をカーネルに提供できなければ なりません。(linux/arch/arm/tools/mach-types を参照してください) 4. カーネルタグ付きリストのセットアップ --------------------------------------- 既存のブートローダ: 任意、強く推奨 新しいブートローダ: 必須 ブートローダはカーネルタグ付きリストを生成し、初期化しなければなりません。 有効なタグ付きリストは ATAG_CORE ではじまり、ATAG_NONE で終わります。 ATAG_CORE タグは空であってもなくてもかまいません。空の ATAG_CORE タグの サイズフィールドは `2' (0x00000002) にセットします。ATAG_NONE のサイズ フィールドはゼロでなければなりません。 リストにはタグをいくつでも含めることができます。前のタグの情報に繰り返しタグが 追加をおこなうのか、それともその情報を全て置き換えるのかは、未定義です。前者の ようにふるまうタグもあれば、後者のようにふるまうタグもあります。 ブートローダは、少なくともシステムメモリのサイズと位置、およびルートファイル システムの位置を渡す必要があります。そのため、最小限のタグ付きリストは次の ようになるでしょう。 +-----------+ ベース -> | ATAG_CORE | | +-----------+ | | ATAG_MEM | | アドレス上昇 +-----------+ | | ATAG_NONE | | +-----------+ v タグ付きリストはシステム RAM に格納します。 タグ付きリストは、カーネル解凍プログラムや initrd `bootp' プログラムが上書き することのないメモリ範囲に配置される必要があります。推奨される配置は、RAM の 最初の 16KiB です。 5. カーネルイメージの呼出し --------------------------- 既存のブートローダ: 必須 新しいブートローダ: 必須 カーネル zImage を呼び出すのには二つの方法があります。zImage がフラッシュに 格納されており、フラッシュから起動しても大丈夫なようにリンクされているならば、 ブートローダがフラッシュ上の zImage を直接呼び出すことは有効です。 zImage はまた、システム RAM に置かれ (場所は問わない)、そこから呼び出されても かまいません。ページテーブルを格納するためにイメージより下の 16K をカーネルが 使用することに注意してください。推奨される配置は、RAM 内の 32KiB です。 いずれの場合でも、下記の条件が成り立っている必要があります。 - CPU レジスタ設定 r0 = 0 r1 = 上記 (3) で発見されたマシンタイプの番号 r2 = システム RAM 内のタグ付きリストの物理アドレス - CPU モード どのような形式の割込みも無効になっていなければなりません (IRQ も FIQ も)。 CPU は SVC モードである必要があります (Angel の場合には特別な例外があります)。 - キャッシュ、MMU MMU はオフでなければなりません。 命令キャッシュはオンでもオフでもかまいません。 データキャッシュはオフでなければなりません。 ブートローダは、カーネルイメージの最初の命令に直接ジャンプすることにより カーネルイメージを呼び出すことが求められています。 ------------------------------------------------------------ 翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ > 翻訳日: 2004/02/13 翻訳者: 川崎 貴彦