2016-01-22 12 views
5

システムの初期化時またはスタートアップコードレベルですべての割り込みを無効にする必要があります。割り込みを無効にしないと何が起こるのですか?システム起動時またはシステム初期化時にすべての割り込みを無効にする必要があるのはなぜですか?

+5

割り込みハンドラがまだインストールされていないためです。それらを無効にしないと割り込みが発生すると、システム/起動がクラッシュします。 –

+3

対応するハンドラがインストールされ、ハンドラが使用するすべてのデータ構造が初期化される前に、割り込みが発生しないようにします。そうしないと、予期しない動作が起こらない可能性があります。 –

+1

リアルモードOSを書いている場合、割り込みを無効にする必要はないかもしれません。デフォルトのリアルモード割り込みテーブルは、問題のBIOS /ハードウェア用に用意されています。保護モードOSを作成する場合は、保護モードに切り替える前に割り込みを無効にする必要があります。割り込みをオンにして保護モードに切り替えると、割り込みベクタテーブル(IVT)が存在しないと、おそらくトリプルフォールトになります。保護モードに入ると、IVTを設定してから割り込みを再度有効にすることができます。 –

答えて

6

割り込みが不要なので、無効になることがあります。
例は数多くあるが、私の頭の上から、私はこれらを考え出すことができます。ss:(e)sp

  • 変更。割り込みが発生すると、flagsレジスタがスタックにプッシュされます。無効なスタック値は、そのコピーをランダムな場所に移動します。 ss:(e)spの変更は少なくとも複数の命令で構成されているため、少なくともx86ではアトミックではありません。
    しかし、コードを正しく書くと、割り込みが無効になることなく同じ原子性を実現できます。これは、automatically disabled on certain occasionsであるためです。

    :8088個のプロセッサ(8086の「弱い兄弟」、最初のx86プロセッサ)、この回答へのコメントでこれらの「特定の場面、」に例外を描いに関するいくつかの専門を口に@MichaelPetch

    SSに値を移動した後で、 次の命令が終了するまで割り込みがオフになっても、SSの変更後に割り込みが正しくオフにされなかったバグの8088 プロセッサがありました。ちょうどそのような場合(そのようなバグのシステムが8088 を実行する可能性はゼロに近い可能性があります)、SS:SPアップデートの周りには、恐竜の恐怖の人たちがCLI/STI となることがよくあります。歴史的な の見通しから、このPC mag articleはこの古代の の問題を明らかにする可能性があります。

    (コードフォーマッタを添加。)IDT/IVTの

  • 欠如。プロテクトモードIDTが初期化されているか、または16ビットリアルモードIVTが変更されている(またはゼロにされているなど)場合、割り込みは命令が存在しないメモリ位置にジャンプします。

通常、IDT/IVTを非アトミックな方法で変更する操作では、割り込みを無効にする必要があると言えます。


私は自分でいくつかのブートローダを作成しており、通常はブートローダの実行時間全体を通して割り込みを無効にしています。保護モードでは、私は最終的にそれらを再び有効にします。 Linux 4.2も同様です。興味があれば、そのソースコード(/arch/x86/boot/)またはMinixからのソースコードを読んでください!

+1

実際には、特別なルールのために、最初のケースで割り込みを無効にする必要はありません。スタックポインタを設定する時間があるので、 'pop%ss'の後に割り込みが1サイクル無効になります。 – fuz

+0

@ FUZxxl完了。あなたはそれを見てもらえますか? – Downvoter

+0

これは正しいことですが、注意してください。このような複数の命令を連続して実行すると微妙な動作が発生します。 – fuz

関連する問題