[ TOP | Recently ]

2009-06-25 STR8132その4

割り込みまわりとcomとtimer入りのkernelはビルドできるようになった。まだ動かないけど。

めんどくさいからとりあえずメモリ32Mあるうちの16Mbyte目、0x21000000 にロードして VA=PA でマッピングして
go すりゃいいやと思ってたら、

kernel text	0xC0000000 〜 0xC1FFFFFF
kernel vm	0xC1000000 〜 0xCFFFFFFF
I/O, SoC regs	0xF0000000 〜 0xFFFFFFFF

みたいにしないとだめっぽいなあ。特にI/Oアドレス空間。
少くともSTR81xx/STR91xx みたいにメモリ空間の大半を占有してしまうようなレイアウトを、もっと狭くマッピングしなおしてやらないとダメっぽ。

そういえば最初に見た linux のパッチもそんなことしてたような、と思って見てみたら、確かに

#define IO_BASE              0xF0000000
#define IO_ADDRESS(x)        (((x >> 4) & 0xffff0000) + (x & 0xffff) + IO_BASE)

として 0x12345678 を 0xf1235678 にマッピングしなおしていた。こいつかー。


            §            §            §


メインメモリ32Mbyteのうち、メモリの頭(0x20000000)から15Mbyte(!)をU-Bootが使っていて、
ここにloadしてしまうとloadした瞬間にU-Bootが落ちてしまう。
netbsd.bin を 0x21000000 にロードして、こんな感じにすればいいのかな。

	Physical Addr
------- -----------------------
FLASH	0x10000000		→ mapped I/O (0xF1000000〜? 空間足りる?)
SoC reg	0x18000000		→ mapped I/O (0xF1800000〜)

RAM	0x20000000 (U-Boot)	→ VM
RAM	0x20F00000		→ VM
RAM	0x21000000		→ KERNEL_TEXT(0xC0000000) + VM + msgbuf
RAM end	0x22000000		

SoC reg	0x30000000		→ mapped I/O (0xF3000000〜)
SoC reg	     :			→ mapped I/O (0xFx000000〜)
SoC reg	0xFFFFFFFF		→ mapped I/O (0xFF000000〜)

0x21000000あるいは任意の場所にロードした後、割り禁にして自分自身を0x20000000にコピーして0x20000000から実行、のほうがレイアウト的には綺麗だしcopyしてjumpまでをrelocatableに書いとけばどこにロードしても動くので汎用性がありそうだが…。
つーか evbarm で KERNEL_BASE_PHYS が $xx200000 になってるやつがいくつかあるけど、前半2Mbyteは放置してるんだろうか、それとも使ってはいけない領域だから触ってないだけなんだろうか。2MbyteもMOTTAINAI!
ちゃんと使い切ってるようには見えないが…

次は evbarm/star/star_machdep.c と evbarm/star/star_starup.S あたりを。


EOF