Linux Kernel 2.6 Documentation:
/usr/src/linux/Documentation/arm/Porting
arm/Porting
ARM Linux を移植するための情報
[プレインテキスト版]
- 原著作者: unknown
- 翻訳者: 川崎 貴彦 <takahiko(a)hakubi.co.jp>
- バージョン: 2.6.4
- 翻訳日時: 2004/03/21
メーリングリストアーカイブ
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)
割込みを初期化するためのマシン固有の関数。
Linux カーネル 2.6 付属文書一覧へ戻る