メーリングリストアーカイブ

    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)
        割込みを初期化するためのマシン固有の関数。
