システムの初期化時またはスタートアップコードレベルですべての割り込みを無効にする必要があります。割り込みを無効にしないと何が起こるのですか?システム起動時またはシステム初期化時にすべての割り込みを無効にする必要があるのはなぜですか?
答えて
割り込みが不要なので、無効になることがあります。
例は数多くあるが、私の頭の上から、私はこれらを考え出すことができます。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. システム起動時にどのコアが最初に初期化されますか?
- 2. Unityシステム実装:アプリの起動時にクラッシュ - MetadataCache ::初期化()
- 3. 割り込み中に割り込みを無効にする必要はありますか?
- 4. システム起動時にmsiをインストールする
- 5. 起動時にAWS SDKプラグインの初期化を無効にする
- 6. 定義時に参照変数を初期化する必要があるのはなぜですか?
- 7. システム起動時に.service起動時にeth0が見つかりません
- 8. レコードのシステムを別のシステムに複製する必要がありますか?
- 9. なぜ私は配列を初期化する必要がありますか?
- 10. システムの起動時にアンドロイドサービスを開始するには?
- 11. ここで割り込みを無効にするのはなぜですか?
- 12. IIS:Webアプリケーションが定期的にハングするとシステムが再起動する必要があります。
- 13. アセンブリのBIOS割り込みでシステム時間を取得
- 14. auto-launchを使ってシステム起動時にアプリケーションを起動するには?
- 15. システムが起動した直後にシステムが停止しているのはなぜですか?
- 16. システム起動時のサービス
- 17. 1つのローカル割り込みまたはプリエンプションを無効にすると、システム全体が4 cpus応答しなくなる可能性があります
- 18. 初期ページの読み込み時にBackbone.jsルーティングを無効にする方法
- 19. コンストラクタ内のすべてを初期化する必要がありますか?
- 20. 初期化時にPendingIntentが起動するようです。
- 21. iPhoneアプリの起動時に起動/初期化の手順は何ですか?
- 22. 初期化リストのスーパークラス - 自己パラメータは時々必要ですが他は必要ありませんか?
- 23. システム起動時にeclipseを起動する
- 24. Appengineの初期化時にTLDスキャンを無効にする
- 25. std :: mapは初期化する必要がありますか?
- 26. ArgumentError:書き込みキーを初期化する必要があります。Rails
- 27. onCheckedChangedシステム初期化時に呼び出されるメソッド
- 28. リアルモードから保護モードに切り替える前に、割り込みを無効にする必要があるのはなぜですか?
- 29. Windowsはシステム起動時にアプリケーションを実行する(ユーザーログイン)
- 30. 作成時にバッファにメモリを割り当てる必要があるのはなぜですか?
割り込みハンドラがまだインストールされていないためです。それらを無効にしないと割り込みが発生すると、システム/起動がクラッシュします。 –
対応するハンドラがインストールされ、ハンドラが使用するすべてのデータ構造が初期化される前に、割り込みが発生しないようにします。そうしないと、予期しない動作が起こらない可能性があります。 –
リアルモードOSを書いている場合、割り込みを無効にする必要はないかもしれません。デフォルトのリアルモード割り込みテーブルは、問題のBIOS /ハードウェア用に用意されています。保護モードOSを作成する場合は、保護モードに切り替える前に割り込みを無効にする必要があります。割り込みをオンにして保護モードに切り替えると、割り込みベクタテーブル(IVT)が存在しないと、おそらくトリプルフォールトになります。保護モードに入ると、IVTを設定してから割り込みを再度有効にすることができます。 –