/var/log/messages

May 28, 2014 - 1 minute read - Comments - programming

pi-baremetal

ちょっとヨユーをカマして確認してみたりなど。

始点は 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 で書いてるのか、がアレです。