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