[Armadillo:01965] Re: linux-2.6.22のArmadillo-300へのポーティング

Jun Kawashima email@hidden
2007年 8月 28日 (火) 14:02:44 JST


お世話になります,川島です.

> zImage必要ですか? hermitで gzip圧縮されたカーネルを展開してくれるので、
> zImageには対応していないのですが、なにか理由があれば今後の参考のために
> 教えてください。

特に必要な理由はありません.ただ,動いた方が解析しがいがある,といったところです.

> zreladdr-yって、zImageの時の kernelのエントリーポイントでしたよね?

はい,zImageの展開先アドレスです.

> 0x108000ではなく、0x28000に変更しているのはなぜですか?

2つ理由があります.(現在も調査中で,確証はありません.)

1) 展開後のImageが期待する値との整合性をとるため
Imageは自身が(arch/arm/Makefile中で定義される)TEXT_OFFSETにロードされることを期待します.armadillo-300の場合,textofs-$(CONFIG_MACH_ARMADILLO300)
:= 0x00028000 となっているため,展開先アドレスもそれに従う必要があります.

2) 0x00108000の場合,zImageの自己解凍時に圧縮イメージ部分が破壊されるため
hermitは,zImageを0x00028000にロードします.
zImageは自己解凍時に,キャッシュとバッファを有効にするためにMMUを利用します.その際ページディレクトリを作成する必要があるのですが,ページディレクトリの作成先をzreladdrの前方16KBにとります.(arch/arm/boot/compressed/head.Sの__setup_mmu)
この時,作成先がzImageがロードされた部分と重なっているかどうかチェックしていません.
zImageが0x00028000にロードされた時,zImage中の圧縮されたカーネルイメージは0x0002B27C - 0x001C8Dc1 に存在します.
zreladdrが0x00108000であるため,その前方16KBはカーネルイメージ中になってしまいまい,ページディレクトリ作成に伴い破壊されます.
よって,zreladdr=0x00108000のままzImageを展開すると,CRCエラーが発生します.

補足:
zreladdrを0x00028000とすると,zImage自体が同じアドレスにロードされているためまずいと思われますが,head.Sは展開先を一時的に変更し,後に上書きすることでうまく対処しています.この際は,ページディレクトリが0x00028000の前方16KBにとられるため,zImageが破壊されることはありません.これについては,
http://d.hatena.ne.jp/junkawa/20070827/1188190139 にて解説しています.

> ところで、パッチ作成時に参考になる資料として、「the perfect patch[1]」
> というのをカーネルメンテナーのAndrew Mortonが書いています
> 日本語訳[2]もあるようです。
>
> [1]: http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt
> [2]:http://www.linux.or.jp/JF/JFdocs/tpp.txt

ありがとうございます.参考にさせていただきます.



armadillo メーリングリストの案内