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, &param);
  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"); /* トラップ割込み発行 */
}

みたいなソレを見つけてますけど、ちょい限界。ぐだ生始まったし。