3

Webサーフィン中に512バイトのOSコンテストを見つけました。

すべてがブートセクタに組み込まれています。

それらのソースファイルのいくつかを読んだ後、

cliルーチンを開始する前に常に指示があることがわかりました。(組み立て中)

use16
org 7c00h
jmp 0:start
start:
  cli
  do something here..(this section sometimes include int 10h)

私が疑問に思うのは

  1. cliルーチンを開始する前になぜ必要なのか。

  2. 後でcli、時々、彼らは割り込みを使用します!int 10hなぜ彼らが割り込みを使用するのだろうかと思うように、cliそれは正常なのだろうか?

4

2 に答える 2

6

1)ブートセクターの初期化の前(または内部)に必要なcli唯一のケースは、ブートセクターが8086で実行される可能性がある場合です。後のCPUのロードでは、次の命令が終了するまで割り込みが無効化(延期)されます。使用する可能性のあるIRQハンドラーの有効なものをロードして取得します。ssspss:sp

2)ソフトウェア割り込み(例int 0x10)はIRQではなく、によって無効にされませんcli。IRQを台無しにしないために、aのsti直後に実行するのが通常です。cli512バイトで何かをスクイーズしようとしているときは、正気のプログラマーがコードの余分なバイトをスクイーズするだけで許可することを許可しない(割り込みを無効のままにするなど)愚かなことをするのが普通です。

于 2012-05-21T03:01:05.380 に答える
4

cli現時点でハードウェア割り込みを処理したくない場合にのみ必要です。

実際のコードを見ずに、参照しているコードで使用されている理由を判断するのは難しいですが、一般的には複数の理由が考えられます。

  • 割り込みサービスルーチンとの競合状態を回避するため(共有可変データにアクセスする場合)
  • 割り込みベクタテーブルをアトミックに変更するには(上記と非常によく似ています)
  • アトミックに変更するSS:SP(上記と非常によく似ています)
  • CPUモードの切り替え中にISRによって引き起こされる例外を回避するため(実際の<->保護)
  • ISRの寄与を回避して時間をより正確に測定する

基本的に、ハードウェアISRが望ましくない方法でメインコードに干渉する可能性がある場合は常に、割り込みを無効にします。

ああ、int 10hハードウェアからの割り込み要求とは何の関係もありません。一部のISRは(キーボードやネットワークなどからの)ハードウェア割り込みを処理するために使用され、他のISRは便利なインターフェイスを備えたさまざまなヘルパールーチンまたはシステムコールとして使用されます(ISRの正確な場所を知る必要はありません。数(10時間)で十分です)。BIOSint 10h機能を使用すると、表示モードを変更したり、画面にテキストを書き込んだりできます。

于 2012-05-21T03:02:28.517 に答える