• 追加された行はこの色です。
  • 削除された行はこの色です。
  • 割り込み へ行く。

*目次 [#o1aba4f9]

#contents


*割り込み [#w5bf3e21]

 プログラム実行中にコンピュータにとって予測していなかった何らかの事態が起こることがある。例えばハードウェアの異常、ユーザーからのデータの入力(ユーザーの動きはコンピュータにとって予測不能)、何らかのエラーなどである。こうした事態が発生したときにはそれぞれの事態に対応できるプログラムが呼び出されるようになっている。これを''割り込み''という。つまり、割り込みとは一言でいうと「横入り」といえる。

#img(http://s-akademeia.sakura.ne.jp/main/image8/cpu_protection.jpg)
#img(,clear)

 割り込みが起こると、コンピュータはそれまで実行していたマシン命令列を中断する。割り込みが起こった原因が特定されると、ジャンプ命令により、問題解決に必要な新たなマシン命令列のアドレスがプログラムカウンターに書き込まれる。割り込み要求に対応するプログラムが起動され、問題が解決されると、コンピュータは割り込み前に行っていたマシン命令列に戻るというわけだ。


 割り込みの仕組みのおかげで、プログラムが動作しながらシステムの利用者が[[キーボード]]を使って入力したり、[[OS]]はネットワークからデータを受信したりすることができる。ディスクのI/Oが戻った場合などにもハードウェア割り込みがかかる。

*スーパーバイザーコール [#f25f5690]

 ''スーパーバイザーコール(Super Visor Call:SVC)''とは、システムの資源に対して一定の手順で安全にアクセスする手段を提供するものである。''システムコール(system call)''とも呼ばれる。

 スーパーバイザーコールを実行する場面として、次のような場合が挙げられる。

-ファイル入出力の場合
--ファイルのオープンやクローズ、ファイルのリードやライトなど
-通信の場合
--コネクションの確立・解放、送信・受信など
-タスク(プロセス)操作の場合
--子プロセスの生成・KILL、ロードモジュールの実行など

 スーパーバイザーコールは、一般的な手続き(関数呼び出し)の形式を取る。しかし、扱いが難しいので、ライブラリ関数で隠蔽されており、ユーザーに対しては簡易なインターフェイスを提供することが多い。


**割り込み制御とスーパーバイザーコール [#ja45f8ee]

 プロセッサは特権モードと非特権モードの2つのモードで動作している。

-特権モード(カーネルモード、スーパーバイザーモード、マスターモード)
--記憶装置や入出力装置などのシステムの資源にアクセスできるモードのこと。
--これ以外のモードで動作しているタスクがシステムの資源にアクセスする場合は、スーパーバイザーコールによってCPUを特権モードに切り替える必要がある。
-非特権モード(ユーザーモード、プログラムモード、スレーブモード)
--コンピュータの資源にアクセスできないモードのこと。
--非特権モードからシステムの資源にアクセスする場合は、スーパーバイザーコールを実行することでアクセスが可能になる。



*割込み機能の良し悪し [#xcce24ef]

 割込み機能の良し悪しは、マイコンの機能上からかなり重要な意味をもっており、かつてはCPUが新しくなるごとに割込み機能の改善されたものが発表されていった。

 例えば、Intel [[8085]]では[[8080]]に比べて、割込み端子が5端子に増加し、大幅に割込み機能が強化され、マルチレベルの割込みが可能となっている。

**割り込みとサブルーチンの違い [#te9469a4]

 どちらもプログラムの途中で別のプログラムを実行するが、サブルーチンはあらかじめ予期されていたものなのに対して、割り込みはCPUにとってまったく予想されていないものである。外部の論理回路がCPUの動作とまったく無関係に割り込み要求信号を出して、処理の流れを変えてしまうのである。すると、CPUは今実行しているプログラムを一時中断して、割り込みしてきたプログラムに取り掛かる。そして、それが終われば、再び元のプログラムの途中から処理を始める。


*割り込みの実現 [#q80a6686]

 割り込みを実現する方法を大別するとソフトウェア的な割り込みとハードウェア的な割り込みがある。

 [[C言語]]などではforやif文であまり意識しないが、[[アセンブリ言語]]レベルではGOTO文に相当する命令でジャンプする。 また、GOTO文がなくても、ハードウェア的に割り込み線を介して強制的にジャンプすることもできる。

 ソフトウェア・ハードウェアのいずれにせよ、割り込みが発生すると、あらかじめ決まった場所にジャンプするわけである。すると、ジャンプしたアドレスが書き込まれたレジスタに上書きされる。例えば、100msごとに各プログラムが切り替わったりする。しかしながら、人間にとっては見かけ上マルチタスクに動いているように見えるわけだ。

 なお、CPUプロテクションを守らなくてもよいなら、タイマー割り込みというハードウェアがなくてもOSに処理が戻ってくる。 

例:Windows 95では、アプリ開発者側が一定時間後にOSに切り替えるルーチンをわざわざプログラムに記述するような仕様であった。
#divid(s,notice)
[例]Windows 95では、アプリ開発者側が一定時間後にOSに切り替えるルーチンをわざわざプログラムに記述するような仕様であった。 ◇
#divid(e,notice)

**割り込みベクタテーブル [#a663b21b]

 プログラム内で次の命令を使うと、ソフトウェア割り込みが発生する。

 int 21H

 また、キーボード上の特殊なキーを押したりすることでハードウェア割り込みが発生する。これは割り込みコントローラというチップで制御される。

 割り込みが発生すると、現在実行中のルーチンは一時停止する。現在のフラグ状態をスタックに保存する(PUSHFに相当する)。~
 さらに、多重割り込みを防止するために、IF(割り込み許可フラグ)をクリアする((IFをセットすると外部からの割り込みが許可される。))。また、TF(トラップフラグ)をクリアする((TFをセットするとシングルステップモードになる。))。~
 現在の番地情報であるCSとIPをスタックに保存する。これは割り込みルーチンからの戻り番地情報になる。

 ソフトウェア割り込みとハードウェア割り込みは合計して256個存在する。それらはそれぞれ00〜FFの番号が割り振られている。この割り込み番号からアクセスするメモリの番地を計算する。~
 例えば、8086CPUでは、0〜3FF番地(10進数で0〜1,023番地)に割り込み処理のアドレス(実際にはオフセット)の情報がある。このアドレスは''割り込みベクタ''と呼ばれ、割り込みベクタの集まりを''割り込みベクタテーブル''という。

#img(http://security2600.sakura.ne.jp/main2/image5/warikomi_vetor_table.png)
#img(,clear)

 割り込み1個分のデータは「IP用オフセット」と「CS用オフセット」の合計4バイトが割り当ててある。「int 21H」であれば、84H番地(=21H×4)にアクセスする。すると、「割り込み21H用のIP用オフセット」「割り込み21H用のCS用オフセット」を知ることができる。割り込み処理ルーチンの番地を計算し、そこにジャンプし割り込みの内容を実現する。


*割り込みの分類 [#l1a3c1d9]

**マスカブル割込みとノンマスカブル割込み [#fb28d952]

 機能的に割込みを分類すると、次のように分類される。

-ノンマスカブル割込み(non-maskable interrupt)
--いつでも割込みを受け付ける。
-マスカブル割込み(maskable interrupt)
--実行中のプログラムが割込み受け付け許可を指定したときだけ受け付ける。


**内部割り込みと外部割り込み [#sdec554a]

 割り込み処理は、その名称と要因(原因)を整理して覚えておこう。

-内部割り込み(internal interrupt):実行中のプログラムが原因
--プログラム割り込み(演算例外割り込み)
---桁あふれ(オーバーフロー)やゼロによる除算などで発生する割り込み。
---例:オーバーフローやゼロ割り、仮想記憶のページ不在、主記憶装置の記憶保護違反
--ページフォールト
---仮想記憶管理において、存在しないページへアクセスを行ったことによって発生する割り込み。
--トレース割り込み
---デバッグ時などにおいて、一命令を実行するごとに発生する割り込み。
--特権命令違反割り込み
---非特権モードにおいて、スーパーバイザーコールを実行しようとしたことによる割り込み。
--命令コード異常割り込み
---存在しない命令の実行によって発生する割り込み。
--SVC割り込み(スーパーバイザーコール割り込み、監視プログラム呼び出し割り込み、システムコール)
---スーパーバイザーコールによって発生する割り込み。
---この割り込みはCPU内部で発生するものだが、プログラムが意図して発生させるという点で他の内部割り込みと異なる。そこでスーパーバイザーコールによる割り込みのことを特に''割り出し(trap)''と呼ぶ。
---例:プログラムからSVが呼び出され、特権命令を実行した
-外部割り込み(external interrupt):実行中のプログラム以外の外部の原因
--機械(マシン)チェック割り込み
---ハードウェアの異常をCPUに知らせる割り込み。
---例:主記憶装置の障害、ハードウェアの故障、電源異常
--入出力割り込み
---入出力が終了した時点で発生する割り込み。
---入出力割り込みによって、処理装置と入出力装置の並行動作が可能となる。[[マルチプログラミング]]と関係する。
---例:入出力装置の動作完了、紙切れ・インク切れなどの中断
--タイマー割り込み
---[[ラウンドロビン]]または[[多段待ち行列]]方式において、CPUを一定時間使用すると発生する割り込み。
---例:定められた時間が過ぎた
--コンソール割り込み
---例:オペレータが割り込みスイッチを押した


*割り込みの検出法 [#d2706085]

 割り込みの検出法としては、CPUが割り込みを確認するときまで割り込み要求の信号レベルを保持しなければならないもの、割り込み要求パルスの立ち上がりのエッジだけで検出するもの、およびその両者を組み合わせたものなどがある。


*割り込みの優先順位 [#qd79223f]

 数値が低い方が優先度が高いことを意味する。

+電源異常
+SVC割り込み
+プログラム割り込み
+入出力割り込み


*割り込みのマスク [#x74cf15d]

 割り込みを禁止・許可するには''マスクレジスタ''と''フラグレジスタ''を用いる。

-マスクレジスタ
--割り込みを許すか否かを決定するレジスタ。
--ゼロ(割り込みなし)で受け付けられる。
-フラグレジスタ
--演算命令を実行したときの実行結果の状態を保持する''状態レジスタ''と、マイクロプロセッサ自身の状態を示す''制御レジスタ''がある。

 状態レジスタと制御レジスタはさらに次のように細分化される。

#img(http://security2600.sakura.ne.jp/main2/image2/flag.jpg)
#img(,clear)

-状態レジスタ
--キャリーフラグ(Carry)
---算術演算命令では、演算結果にキャリーかボローが生じた場合に、キャリーフラグをセットする。
---シフト演算命令では、左シフト(左回転)の場合MSB(Most Significant Bit)を、右シフト(右回転)の場合LSB(Least Significant Bit)をキャリーフラグに保持する。
---論理演算命令やスワップ命令の場合、キャリーフラグをクリアする。
--オーバーフローフラグ(Overflow)
---算術演算命令では、演算結果に桁あふれが起きた場合、オーバーフローフラグをセットする。
---論理演算命令では、必ずクリアする。
---シフト演算命令では、演算前と演算後の符号ビットが異なれば、オーバーフローフラグをセットする。
--ゼロフラグ(Zero)
---演算命令実行後、その演算結果がゼロであればゼロフラグをセットする。
--サインフラグ(Sign)
---演算命令実行後、その演算結果が(2の補数表現で)負の数であれば、サインフラグをセットする。
-制御レジスタ
--許可フラグ(Int. Enable)
---マイクロプロセッサが外部割りこみを許可するか否かを示す。
---1で割り込みが許可される。
--スーパーバイザー・ユーザーフラグ(S/U)
---プロセッサステータスを示す。

*割り込みを確認する [#v98580bd]

**Linuxの場合 [#g25a88d8]

-割り込みはvmstatで見ることができる。

**Windowsの場合 [#s4358bd1]

-パフォーマンスモニタのProcessorにある「Interrupt/sec」((なければ右クリックのカウンタの追加で表示するように設定できる。))の数値で現状を確認できる。


*割り込みとサブルーチンの違い [#w1827e79]

 どちらもプログラムの途中で別のプログラムを実行するが、サブルーチンはあらかじめ予期されていたものなのに対して、割り込みはCPUにとってまったく予想されていないものである。外部の論理回路がCPUの動作とまったく無関係に割り込み要求信号を出して、処理の流れを変えてしまうのである。すると、CPうは今実行しているプログラムを一時中断して、割り込みしてきたプログラムに取り掛かる。そして、それが終われば、再び元のプログラムの途中から処理を始める。



*参考文献 [#n0063a93]

-『新世紀デジタル講義』
-『マイコン入門心得帖』
-『実践コンピュータシステム』
-『必修TK85で学ぶ マイコン制御とアセンブラ入門』
-『ソフトウェア開発技術者 合格エッセンシャルハンドブック』
-『1週間で分かる基本情報技術者集中ゼミ【午前編】 2006春秋』
-『OS・ストレージ・ネットーワーク』

-『高級言語プログラマのためのアセンブラ入門』