メーリングリストアーカイブ http://lists.arm.linux.org.uk/pipermail/linux-arm-kernel/2001-July/004064.html より。 最初の定義 ---------- 下記のシンボル定義は、あなたのマシンにおいて __virt_to_phys() がおこなう 変換をあなたが理解しているということを前提としています。このマクロは、 渡された仮想アドレスを物理アドレスに変換します。通常これは、下記のような 単純なものです。 phys = virt - PAGE_OFFSET + PHYS_OFFSET デコンプレッサ (解凍器) シンボル -------------------------------- ZTEXTADDR デコンプレッサの開始アドレス。ここでは、仮想アドレスや物理アドレスに ついて話すことはありません。というのも、デコンプレッサのコードを呼び 出すときには、MMU はオフになっているからです。カーネルをブートさせる ため、通常はこのアドレスにあるカーネルを呼び出します。RAM に存在する 必要はなく、フラッシュやその他のリードオンリーもしくは読み書きできる アドレス指定可能なメディアに置くことができます。 ZBSSADDR デコンプレッサ用のゼロで初期化される作業領域の開始アドレス。これは RAM を指していなければなりません。デコンプレッサは、この領域をゼロで 初期化します。これについても、MMU はオフです。 ZRELADDR これは、解凍されたカーネルが書き込まれ、最終的に実行されるアドレス です。次の制約条件が成り立っている必要があります。 __virt_to_phys(TEXTADDR) == ZRELADDR カーネルのはじめの部分は、位置独立となるように注意深くコーディング されています。 INITRD_PHYS 初期 RAM ディスクを配置する物理アドレス。bootpImage 関連のもの (これは古い構造体 param_struct でのみ機能します) を使う場合のみ 関係します。 INITRD_VIRT 初期 RAM ディスクの仮想アドレス。次の制約条件が成り立っている必要が あります。 __virt_to_phys(INITRD_VIRT) == INITRD_PHYS PARAMS_PHYS param_struct 構造体もしくはタグリストの物理アドレス。実行環境に関する 様々なパラメータをカーネルに与えます。 カーネルシンボル ---------------- PHYS_OFFSET RAM の一番目のバンクの物理開始アドレス。 PAGE_OFFSET RAM の一番目のバンクの仮想開始アドレス。カーネルのブート段階で、仮想 アドレス PAGE_OFFSET は物理アドレス PHYS_OFFSET にマップされます。 指定されたその他のマッピングもおこなわれます。これは TASK_SIZE と同じ 値となるでしょう。 TASK_SIZE バイト単位でのユーザプロセス最大サイズ。ユーザ空間は常にゼロから開始 するので、これは、ユーザプロセスがアクセスできる最大アドレス + 1 と なります。ユーザ空間スタックはこのアドレスから下方向に伸びていきます。 TASK_SIZE より下の仮想アドレスは全てユーザプロセス領域となるので、 カーネルのプロセス基部により、プロセス単位で動的に管理されます。 これをユーザセグメントと呼んでいます。 TASK_SIZE より上の部分は全て、全プロセスで共通となります。これを カーネルセグメントと呼んでいます。 (言い換えますと、TASK_SIZE, つまりは PAGE_OFFSET よりも下には I/O マッピングをおこなえないということになります) TEXTADDR カーネルの仮想開始アドレスであり、通常は PAGE_OFFSET + 0x8000 です。 最終的にカーネルイメージがここにきます。最新のカーネルでは、128MB 範囲の 32768 バイトになければなりません。以前のカーネルでは、ここの 制限は 256MB でした。 DATAADDR カーネルデータセグメントの仮想アドレス。デコンプレサを使う場合には 定義されていてはいけません。 VMALLOC_START VMALLOC_END vmalloc() 領域の境界を示す仮想アドレス。この領域にはいかなる静的な マッピングも含めてはなりません。vmalloc が上書きしてしまいます。 アドレスはまた、カーネルセグメント内でなければいけません (上記参照)。 通常、vmalloc() 領域は (変数 high_memory を用いて求められる) 最後の 仮想 RAM アドレスから VMALLOC_OFFSET バイトだけ上位より開始します。 VMALLOC_OFFSET 仮想 RAM と vmalloc 領域間のホールを提供するため、通常は VMALLOC_START に取り込まれるオフセットです。範囲外のメモリアクセス (たとえばマップ されたメモリマップの終端を消去したりする等) を捕捉するため、このように しています。通常 8MB にセットされます。 アーキテクチャ固有マクロ ------------------------ BOOT_MEM(pram,pio,vio) `pram' には RAM の物理開始アドレスを指定します。常に存在している必要が あり、PHYS_OFFSET と同じであるべきです。 `pio' は、arch/arm/kernel/debug-armv.S 内のデバッグ用マクロで使用される I/O を含む 8MB の範囲の物理アドレスです。 `vio' は 8MB のデバッグ用領域の仮想アドレスです。 デバッグ用領域は (MAPIO 関数を経由して) コード内のアーキテクチャ固有コード により再初期化されることが期待されています。 BOOT_PARAMS 文字通りです。PARAMS_PHYS も参照してください。 FIXUP(func) マシン固有の fixup であり、メモリサブシステムが初期化される前に実行されます。 MAPIO(func) I/O 領域 (上述のデバッグ用領域も含む) をマップするためのマシン固有の関数。 INITIRQ(func) 割込みを初期化するためのマシン固有の関数。