2009-10-06 11 views
5

ASM/C/C++プログラムですべての割り込みを無効にして、プロセッサを完全に制御できますか?ハードウェアとソフトウェアの割り込みを無効にする

「はい」の場合>どうすればよいですか?

"アトミック"オペレーションシステムコールがどのように機能するか(クリティカルセクションに入るなど)?

ありがとうございました!

+4

使用しているプロセッサーを指定する必要があります。もしあれば、どのOSも。現代のデスクトップ/サーバーオペレーティングシステムでは、ユーザーランドコードは通常、非特権モードで実行されます。 – nos

+0

どのプロセッサですか?どのOS? –

+0

MS Windows(XP SP2/SP3、Vista、7)x86およびx64バージョン 最新のIntelプロセッサ(Intel Core 2 Duoなど) –

答えて

3

(x86および他のほとんどの最新プロセッサー)では、アトミック命令を使用できます。他のスレッド/プロセッサがそのメモリにアクセスする前に実行を終了しないことを願うもの。

Win32には、サポートされているプラ​​ットフォームでそれを抽象化するInterlocked *関数があります。

MIPSでは、多くの命令が命令の最後に.Iを追加して、インターロックを保証することができます。 x86のアセンブリにおいて

+1

x86では、特定の命令の先頭に "ロック"を付けてアトミックにすることができます。 – hirschhornsalz

+0

ああありがとう:)それは何かのようにしなければならなかった:) – Goz

+0

私にソースコードの例を教えてもらえますか? –

4

コマンド

  • stiセットはビット
  • cliクリア割り込み許可されるこれらのコマンドは、設定されたビット

を有効にしてIF Flagをクリア割り込み。 IFフラグがセットされると、CPUはハードウェア割り込みを処理し、クリアされるとCPUはハードウェア割り込みを無視します。ただし、ノンマスカブル割り込みの処理には影響しません。また、ソフトウェア割り込みや例外に影響を与えません。これらの命令は、非特権モード(通常はに応じてリング0より上位のもの)でも動作しません。

+4

あなたはそれを後方に持っています。 STIは割り込みを有効にします。 CLIはディセーブルです。 –

+0

また、ソフトウェアの割り込みや例外を無効にしません。 – Stewart

+0

あなたのコメントと編集をお寄せいただきありがとうございます.STIは割り込みを有効にし、CLIは割り込みを無効にします。私はそれが他の方法であったと確信していましたが、私はC64で私のアセンブリを学んだので、私はそれを探しました:6510はCLIが無効にしてSTIを有効にしました。よくわかりません;-) –

0

x86にはFLAGSレジスタに割り込みフラグ(IF)があります。このフラグが0に設定されている場合、ハードウェア割り込みは無効になり、それ以外の場合は有効になります。コマンドcliはこのフラグを0に設定し、stiはそれを1に設定します。値をFLAGSレジスタにロードする命令(popfやiretなど)もこのフラグを変更できます。

幸運!

関連する問題