読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

起動の流れ

P424

  1. ブートストラップローダプログラムがルートディスクのブロック番号0にあるブートストラッププログラムをメモリのアドレス0に読み込んで実行する
  2. ブートストラッププログラムはルートディスクのファイルシステムから/unixや/rkunixといったカーネルプログラム本体をメモリのアドレス0に読み込んで実行する
  3. カーネルがシステムの初期化を行う

だんだん実行対象が大きくなっているのは今と同じだが、同じ場所でブートを行っているので若干複雑

あと、全部アセンブリでごにょごにょしているので、結構複雑

start

MMUはまだ有効化されていなくて物理アドレスを直接扱っている状態

MMU

startが動いていろいろやる

まずやるのはカーネル空間の設定

APRに領域が割り当てられている

SR0を設定してMMUを有効化

startの処理はアセンブラ

.globl start, _end, _edata, _main
start:
    bit $1,SSR0
    bne start         / MMUが有効になっていたら処理を継続させない
    reset

/ initialize systems segments

    mov $KISA0,r0 / KISA0とKISD0はそれぞれカーネルAPR0のPARとPDRのアドレスをあらわす
    mov $KISD0,r1
    mov $200,r4
    clr r2
    mov $6,r3
1:
    mov r2,(r0)+
    mov $77406,(r1)+        / 4k rw
    add r4,r2
    sob r3,1b

/ カーネルAPR6の初期化

    mov $_end+63.,r2
    ash $-6,r2
    bic $!1777,r2
    mov r2,(r0)+        / ksr6 = sysu
    mov $usize-1\<8|6,(r1)+

/ カーネルAPR7の初期化
    mov $IO,(r0)+
    mov $77406,(r1)+        / rw 4k

/ スタックポインタの初期化とMMUの有効化
    mov $_u+[usize*64.],sp
    inc SSR0

/ BSS領域のクリア
    mov $_edata,r0
1:
    clr (r0)+
    cmp r0,$_end
    blo 1b

/ proc[0]のuser カーネルスタック領域を0クリア
    mov $_u,r0
1:
    clr (r0)+
    cmp r0,$_u+[usize*64.]
    blo 1b

/ main()の呼び出し
    mov $30000,PS
    jsr pc,_main
    mov $170000,-(sp)
    clr -(sp)
    rtt
APR PAR PDR
0 0 077406
1 0200
2 0400
3 0600
4 01000
5 01200
6 カーネルサイズによる 007406
7 07600 077406

各領域はがっちり振り分けられているわけではなく、 5と6で領域がラップしている(だぶっている)