In-Reply-To: <Subject: [kernel-ml 74] KERNEL running success?>
藤井 俊典<TBE01041@niftyserve.or.jp> さん
> Joy こと藤井俊典です。
>
> 少々不明点はありますが 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 に設定するのは間違いのはずです。
確かに、dup_vmap_table() の値を CR3 に入れるのはまちがいです。
task.c (cre_tsk()) の中で dup_vmap_table() を呼ぶときの正しいコードは、
次のようになります(dup_vmap_table() の返り値を 0x7fffffff でマスクして
いる)。
if (pk_ctsk->addrmap != NULL)
{
newtask->context.cr3 = (UW)(pk_ctsk->addrmap);
}
else
{
newtask->context.cr3 = (UW)dup_vmap_table (run_task->context.cr3) & 0x7fffffff;
> それにこの関数のなかで
> (UW)dest = (UW)dest | 0x80000000;
> という記述で最初に渡した正しいCR3のアドレス(0x3000)を(0x80003000)に変えて
> いる部分が
> おかしいと思いますがどうでしょうか?
dup_vmap_table() の最初で 0x80000000 と OR を取っているのは、そのアド
レスにアクセスするためです。
0x80000000 - 以降のアドレスは、物理アドレス 0x00000000 と対応していま
す。
dup_vmap_table () は、仮想ページディレクトリの内容をコピーするものなので、
物理メモリをアクセスする必要があります。このとき、物理アドレスをそのま
まアクセスすることはできないので、0x80000000 を OR しているわけです。
ちなみに、CR3 の値をそのままコピーしてしまうと、2つのタスクで同じ仮想
ページディレクトリを使ってしまうので、うまくありません。
> あと palloc() ですが、これは論理アドレスを返してくれるのかな? (いま調べ
> ている最中)
論理アドレスです。正確には、アロケートした物理ページのアドレス +
0x80000000 という値です。
> そして最大の問題はなぜこれで他の人は動いたのだろうかという問題です。
これは、私も不思議です。
> もしかして PC-98 にアドレスの最上位のアドレスを無視する機構がついている
> のだろうか?
> 仮想記憶のマッピングを見るとそんな気がする(ここらは憶測)
確かに、昔の PC9801 では、物理メモリ上位のビットは無視するというかデコー
ドしていませんから、この辺に原因がありそうな気がします。
>
> あとは私のもっているソースのバージョンですが一応最新のはずなのだが。
> (19950805.tar.gz)
>
> 最後に
>
> もう少し調べてから私の動いたカーネルをシルバーミレニアムの方へアップロー
> ドしますので、もし動かない人がいたら試してください。
申し訳ないですが、dup_vmap_table() の返り値を 0x7fffffff でマスクした
ものも試していただけないでしょうか?
----------
内藤隆一 (ggc00661@niftyserve.or.jp/night@bfree.rim.or.jp)