ちょっとヨユーをカマして確認してみたりなど。
始点は start.s です。各動作モードのスタックポインタを設定して initsys 手続きに jmp している模様。記載されているコメントをなんとなく控えてみます。
-
kernel.img は 0x8000 にロードされる
-
その前の 0x4000-0x7fff は 1MB メモリな page table
-
0x3c00-0x3fff はカーネル向けの page table (initsys.c を確認のこと)
-
スタックはその下で以下なカンジ
- 0x2c00 - 0x3c00 システムな stack
- 0x2800 - 0x2c00 IRQ 向け
- 0x2400 - 0x2800 Abort 時
- 0x2000 - 0x2400 スーパバイザ (SWI/SVC) 向け
-
スタックポインタに格納される値と MMU が on で云々なあたり、ちゃんと読めてないですが、MMU の on/off にかかわらず、という理解で良いのかな
手続きを見るに 0x80000000 を加算した値をスタックポインタに設定してますね。とりあえず確認が必要な事項を以下に。
- cps という命令とそれぞれの mode
- Turn on unaligned memory access な手続きの意味
もう少し
initsys.c の冒頭に以下なコメントがあります。
/* Virtual memory layout
*
* 0x00000000 - 0x7fffffff (0-2GB) = user process memory
* 0x80000000 - 0xa0ffffff (2GB) = physical memory
* includes peripherals at 0x20000000 - 0x20ffffff
* 0xc0000000 - 0xefffffff = kernel heap/stack
* 0xf0000000 - 0xffffffff = kernel code
*
* Memory from 0x80000000 upwards won't be accessible to user processes
*/
ユーザプロセスに割り当てられるメモリのサイズは 2GB という事になるのか。ちょっと仮想メモリ云々な部分、色々な意味でリハビリ必要なはずなので。
つうか
何故に C で書いてるのか、がアレです。