Yamanetoshi
14 June 2014
yamanetoshi
ソースコード
以下にて取得。
$ git clone https://code.google.com/p/xv6-rpi/
確認
可能な限り pi-baremetal と比較しつつ読みたいがどうなるか。
掘削ログ
エントリポイントは src/entry.S なんですが、kernel.ld 見てみるに以下な記述あり。
SECTIONS
{
/* the entry point, before enabling paging. The code to enable paing
needs to have the same virtual/physical address. entry.S and start.c
run in this initial setting.*/
. = 0x10000;
こちら、QEMU 向け、な記述になっている模様。これを
. = 0x8000
にすれば良いのかどうか。
entry.S ざっくり
kernel.ld で定義されている以下の番地を 0 で初期化しています。
/*define a stack for the entry*/
. = ALIGN(0x1000);
. += ENTRY_SVC_STACK_SIZE;
PROVIDE (svc_stktop = .);
/* define the kernel page table, must be 16K and 16K-aligned*/
. = ALIGN(0x4000);
PROVIDE (_kernel_pgtbl = .);
. += 0x4000;
/* we also need a user page table*/
PROVIDE (_user_pgtbl = .);
. += 0x1000;
PROVIDE(end_entry = .);
src/entry.S に以下なコメントの記述があります。
# clear the entry bss section, the svc stack, and kernel page table
その後、supervisor (SVC) mode に移行してスタックポインタ設定している模様。
# initialize stack pointers for svc modes
MSR CPSR_cxsf, #(SVC_MODE|NO_INT)
LDR sp, =svc_stktop
CPSR_cxsf という命令については別途確認が必要。そして直後で start という手続きに制御を移しています。
BL start
start 手続きについて
定義は src/start.c です。とりあえず set_bootpgtbl という手続きの確認が必要みたいです。コメントにあるように最初は KERNBASE な 0x80000000 と 0x00000000 が同じページを指すようにするはず。
// double map the low memory, required to enable paging
// we do not map all the physical memory
set_bootpgtbl(0, 0, INIT_KERNMAP, 0);
set_bootpgtbl(KERNBASE, 0, INIT_KERNMAP, 0);
あと INIT_KERNMAP は 0x100000 なんですが、これって 1MB って理解で良いのかな。
うーん
なんかどうもこれって QEMU 向けに書かれてるような気がしてならないので、やっぱこちら掘削続けます。
- https://github.com/brianwiddas/pi-baremetal
微妙で申し訳ありません。
参考にしたエントリなど
blog comments powered by Disqus