トップ «前の日記(2007年07月02日) 最新 次の日記(2007年07月05日)» 編集
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|10|12|
2009|02|03|06|07|10|11|12|
2010|01|02|03|04|07|09|10|11|12|
2011|01|03|04|05|06|07|08|10|
2012|01|06|08|09|10|12|
2013|01|02|03|04|07|09|11|12|
2014|01|03|04|05|06|09|
2015|04|
2016|01|08|
ここは旧えびめもです。えびめも2に移行します(2016/12/1)

2007年07月03日

SH3 Linux zImage ブート 昨日の続き

昨日の続き。
展開ルーチンが気になってみてみたら、展開ルーチンの実態は
lib/zlib_inflate/zlib_inflate.o
だった。こいつのサイズはざっくりと
sh3-linux-objdump -x zlib_inflate.o
索引名          サイズ      VMA       LMA       File off  Algn
  0 .text         00002350  00000000  00000000  00000040  2**4
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
0x2340 = 8.8Kバイト。SH3は命令/データ混在 16Kキャッシュなのでキャッシュが流れていかなければキャッシュに入っちゃうかもしれない。4Wayの範囲で。

SH3 Linux zImage ブート

あともう一箇所気になったんだよなぁ。
void decompress_kernel(void)
{
        output_data = 0;
        output_ptr = (unsigned long)&_text+0x20001000;
        free_mem_ptr = (unsigned long)&_end;
        free_mem_end_ptr = free_mem_ptr + HEAP_SIZE;
 
        makecrc();
        puts("Uncompressing Linux... ");
        gunzip();
        puts("Ok, booting the kernel.\n");
}
 
8c001000 g       *ABS*  00000000 _text
8c91843c g       *ABS*  00000000 _end
展開先?が 8c001000+20001000 = ac002000 になってる。なんでだろ?カーネルのエントリポイントは0x8c002000なのだが、オフセット0x20000000を足してP2エリアのキャッシュが効かない場所へ展開している。ためしにここをP1エリアにしたら早くなるかもしれないがキャッシュをフラッシュしてやらないと危険だ。