少々不明点はありますが ITRON の立ち上げに成功しました。
今までリセットがかかってしまう原因はどうも CR3 の設定に問題があったよう
です。
まず最初のタスク切り替え時(lowcore.s - resume() 実行直前)に、切り替え先
のTSS内のcr3の内容を表示すると 0x80044000 という値だった。このアドレスは物
理アドレスとして普通は存在しません。
そこで task.c : cre_tsk() 内でaddr_map の内容を設定している所がおかしい
らしいので、
newtask->context.cr3 = (UW)dup_vmap_table (run_task->context.cr3);
を注釈にして
newtask->context.cr3 = run_task->context.cr3;
の注釈を外して有効にしました。(仮想記憶の追加分を外したことになる)
これで debug> のプロンプトが表示するところまでいけた。ついでに demo も正常
に動作しているようである。
さてここで問題があるが...
vertual_memory.c - dup_vmap_table() の復帰の 0x80044000 というアドレスです
が、これは論理アドレスを返すで正しいのでしょうか? それならこのアドレスを
CR3 に設定するのは間違いのはずです。
それにこの関数のなかで
(UW)dest = (UW)dest | 0x80000000;
という記述で最初に渡した正しいCR3のアドレス(0x3000)を(0x80003000)に変えて
いる部分が
おかしいと思いますがどうでしょうか?
あと palloc() ですが、これは論理アドレスを返してくれるのかな? (いま調べ
ている最中)
そして最大の問題はなぜこれで他の人は動いたのだろうかという問題です。
もしかして PC-98 にアドレスの最上位のアドレスを無視する機構がついている
のだろうか?
仮想記憶のマッピングを見るとそんな気がする(ここらは憶測)
あとは私のもっているソースのバージョンですが一応最新のはずなのだが。
(19950805.tar.gz)
最後に
もう少し調べてから私の動いたカーネルをシルバーミレニアムの方へアップロー
ドしますので、もし動かない人がいたら試してください。