KOZOS (19)
bootload 側の修正については stack の変更に伴う部分な模様。新規追加は無いので以下三点な模様。
# modified: bootload/intr.S # modified: bootload/ld.scr # modified: bootload/startup.s
とりあえず、ld.scr については stack が二つに、ってカンジ (同じ領域ですが
data(rwx) : o = 0xfffc20, l = 0x000300 bootstack(rw) : o = 0xffff00, l = 0x000000 intrstack(rw) : o = 0xffff00, l = 0x000000 /* end of RAM */ }
startup.s にて stack pointer に bootstack なナニが代入されてます。
_start: mov.l #_bootstack,sp jsr @_main
ので bootload なナニは stack 領域として bootstack なソレを使用するんですが、intrstack って何だったかというと kernel stack になるのか。
どこで使われてるか、というと intr.S の割り込みベクタに設定されてる手続き。基本的に bootload なソレは割り込みが disable なので領域を共用しても OK という理解で良いかな。
で、割り込みベクタテーブルに設定されてるナニが以下。
_intr_softerr: mov.l er6,@-er7 mov.l er5,@-er7 mov.l er4,@-er7 mov.l er3,@-er7 mov.l er2,@-er7 mov.l er1,@-er7 mov.l er0,@-er7 mov.l er7,er1 mov.l #_intrstack,sp mov.l er1,@-er7 mov.w #SOFTVEC_TYPE_SOFTERR,r0 jsr @_interrupt mov.l @er7+,er1 mov.l er1,er7 mov.l @er7+,er0 mov.l @er7+,er1 mov.l @er7+,er2 mov.l @er7+,er3 mov.l @er7+,er4 mov.l @er7+,er5 mov.l @er7+,er6 rte
何してるか、というと
- レジスタを順に stack に push
- stack pointer を er1 に格納
- sp に intrstack を設定
- er1 を push
- これは動作しているレジスタの値を push した kernel stack が intrstack に push されてる、という理解で良いのかな
成程。割り込みな stack は然程多重割り込みが発生しないだろうなナニで bootstack と同じサイズで構わんだろう、という事か。
os 側も見るかどうか
もう 30m でぐだ生が始まるのですがもう少しという事にて。とりあえず、って事で main.c を開いてみたら、でーじなってた。
#include "defines.h" #include "kozos.h" #include "interrupt.h" #include "lib.h" /* システム・タスクとユーザ・スレッドの起動 */ static int start_threads(int argc, char *argv[]) { kz_run(test08_1_main, "command", 0x100, 0, NULL); return 0; } int main(void) { INTR_DISABLE; /* 割込み無効にする */ puts("kozos boot succeed!\n"); /* OSの動作開始 */ kz_start(start_threads, "start", 0x100, 0, NULL); /* ここには戻ってこない */ return 0; }
むむむ。ここでスレッドと呼んでいるナニはプロセス、と読みかえても大丈夫なのかどうなのか。ってか kz_run って何だ。
む
syscall.c って何だ、って思ったら今回追加になったソレだな。なんとなく syscall.c で
kz_thread_id_t kz_run(kz_func_t func, char *name, int stacksize, int argc, char *argv[]) { kz_syscall_param_t param; param.un.run.func = func; param.un.run.name = name; param.un.run.stacksize = stacksize; param.un.run.argc = argc; param.un.run.argv = argv; kz_syscall(KZ_SYSCALL_TYPE_RUN, ¶m); return param.un.run.ret; }
とか kozos.c で
/* システム・コール呼び出し用ライブラリ関数 */ void kz_syscall(kz_syscall_type_t type, kz_syscall_param_t *param) { current->syscall.type = type; current->syscall.param = param; asm volatile ("trapa #0"); /* トラップ割込み発行 */ }
みたいなソレを見つけてますけど、ちょい限界。ぐだ生始まったし。