/var/log/messages

debugging with sixth sense

initsys.c 確認 (Pi-baremetal 確認)

ええとコメントに以下な記述があります。

 * The memory is divided in to 4096 1MB sections. Most of these are
 * unmapped (resulting in prefetch/data aborts), except
 * 0x8000000-0xa1000000, which are mapped to 0x00000000-0x2a000000
 * (physical memory and peripherals), and the kernel code and data

何故に 2048 を引いてるのか問題について引き続き確認を。

繰り返しのなかで 0x800 が処理対象の始点なんですが 10 進数にするとこれ、2048 ですね。上のコメントにある通り、0x80000000 から 0xa0ffffff までのページテーブルは 0x00000000 から 0x29ffffff を指す形になるんですね。成程。

で、次に行なっているのが 0x00000000 から 0x000fffff までの要素は同じアドレスに map する、とあります。ただこれは temprary な対処でこの番地には動いてるこの code があるとのこと。そして initsys は 0xf0000000 にカーネルな code を置く (先頭コメントにも同様の記述あり) のでここにある情報は削除するとのこと。

で、早速直後で 0xf0000000 から 0xf00fffff な 1MB のページを in memory な kernel code に対応させるのかどうか。そして直後に kernel は 0x9000 に load されてて云々という記述があります。むむむと言いつつ linkscript 見てみるに以下なコメントの記述があります。

 * The file ends up looking something like this:
 *
 *  File offset Load address    Remapped to
 *  0x00000000  0x00008000  0x00008000  start.o/initsys.o
 *  0x00001000  0x00009000  0xf0009000  .text, .rodata
 *  0x00010000  0x00018000  0xc0000000  .data
 *  n/a     0x00020000  0xc0008000  .bss

ちなみに添字の 3840 は 0xf00 ですね。すばらです。また、次では 0xc0000000 から 0xc000ffff までは kerneldatatable が代入されてます。これは initsys.c で定義されている変数で値は 0x3c00 なのか。ここ、ちょっと謎だな。

あ、マニュアル確認してみるに Coarse page table ってヤツですね。ええと、1|0x3c00 は b0011110000000001 になるのかな。coarse page table base address の値は 0x0f になるのかどうか。

あ、でも start.s に以下な記述がありますね。

 * 0x3c00-0x3fff is the kernel data coarse page table (see initsys.c)

以下の命令って

initpagetable[3072] = 1 | (unsigned int)kerneldatatable;

こうなってるべき、なのかどうか。

initpagetable[3072] = (unsigned int)kerneldatatable<<10 | 1;

むむむ。

Comments