P424
- ブートストラップローダプログラムがルートディスクのブロック番号0にあるブートストラッププログラムをメモリのアドレス0に読み込んで実行する
- ブートストラッププログラムはルートディスクのファイルシステムから/unixや/rkunixといったカーネルプログラム本体をメモリのアドレス0に読み込んで実行する
- カーネルがシステムの初期化を行う
だんだん実行対象が大きくなっているのは今と同じだが、同じ場所でブートを行っているので若干複雑
あと、全部アセンブリでごにょごにょしているので、結構複雑
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で領域がラップしている(だぶっている)