ウォンツテック

そでやまのーと

OS作成

プロセス用のスタック領域がカーネルのメモリ領域(0xC0000000-)になっていたのをプロセス用スタック領域として0xbfffe000-0xc0000000を用意しプロセススイッチ時のespを切り替えるように変更。
プロセスがカーネルモード時(システムコールやスケジューリング割り込みの時)に使用するスタック領域は相変わらず全プロセスで共通の領域を使っていて、これを各プロセスで別々の領域を使おうと考えているんですが、現状のコードだと非常に面倒だという事に気づきました。そこで全プロセスで同一のスタック領域を使えないか考えてみました。

  • カーネルモード中に割り込みが入った場合(スケジューリング割り込み以外)
    • カーネルモード中に割り込みが入ると、割り込み前後のPrivilege Levelは互いに0のため割り込み時にss,espの値をesp0スタック上(TSS構造体のPrivilege Level 0用のスタックポインタ値)に保存する事はなく、またss,espの変化も発生しない。すなわち同一のss,espを使用しても問題無い。
  • ユーザモード中に割り込みが入った場合
    • カーネルモードに移行するためCPUはTSSのesp0値を現espとしiretするまではそのespで動作する。最終的にiretをすればesp値は元の値に戻るため影響は無さそう。
  • カーネルモード中にスケジューリング割り込みが入った場合
    • カーネルモード中なのでss,espの変化は発生しないのでスタック上にss,espが格納される事はない。しかし現状のコードだとss,espが存在するとしてスタック上の値を書き換えているので問題が発生する。※現在は割り込み中の最割り込みを禁止しているのでこれに起因する問題は起きていない。

全プロセスで同一のスタック領域を使うこと自体は問題無さそうだけどカーネルモード中のスケジューリング割り込みはどうにかする必要がありそう。

追記

今発生しているバグ(一般保護例外等)ってfdcドライバでfdcからの割り込み待ちをする時にCPU割り込みを許可していて、その時にスケジューリング割り込みが発生しているために発生している問題のような気がしてきた

追記

fdc割り込み中にスケジューリング割り込みだけを禁止するコードを埋め込んだらかなりバグが減った。けどまだ違う所が原因と思われるpage faultが発生する。