as-6. スーパーバイザモード,
特権命令,割り込み
1
金子邦彦
68000 アセンブラプログラミング)
URL: https://www.kkaneko.jp/cc/as/index.html
到達目標
CPUの割り込みメカニズム
割り込みの種類ごとに,所定の例外処理が呼
び出される
スーパーバイザモードに,自動的に切り替わ
割り込み終了後に「元のモード」に戻る
ハードウエア割り込みについて
割り込み禁止
割り込み発生時のCPUの挙動
現在の処理を中断
例外処理用のプログラム(ハンドラともい
う)が起動される
プログラム実行の流れ
割り込みが発生すると,
処理を中断
処理を再開
rte
rte は例外処理
からの復帰命令
例外処理用のプログラム
割り込みの発生
プログラム実行を中断せねばならないような,
何かの要因が起きたことを「り込みの発生
という
例)
プロセッサ外部からのハードウエアからの要求
現在実行中のプログラム内の何らかのトラブル
など
割り込みの種類
外部割り込み (外部要因)
ハードウエアリセット
入出力: 入出力装置の処理終了や何かの要求
タイマ: ある一定時間が経過したことの通知
マシンチェック: ハードウエアの何らかの異常通知
など
内部割り込み (内部要因)
演算例外: オーバーフロー,0による除算
特権命令違反: システム管理命令をユーザモードで実行
してしまった場合
トラップ命令: オペレーティングシステムの機能呼び出し
アドレスエラー: ワードデータが奇数アドレスからあっ
など
外部割り込みの例
入出力
入出力用のサブプロセッサ(DMAコントローラなど)か
らの信号
入力処理や,出力処理の終了などを信号としてCPU
に伝える
マシンチェック
メモリのエラーチェック回路(ECC)からの信号
メモリに何らかの異常があることを伝える
タイマ
タイマから一定時間ごとに信号が来て,時計機能を実
内部割り込みの例
浮動小数点演算のオーバーフロー
除算命令で,0による除算
システムのデバッグのために,一命令の実行ご
とに強制的に掛かる割り込み
特権命令を,ユーザモードで実行した場合
プログラム内に何らかの特別な条件が成立す
ることによる割り込み (外部とは関係ない)
割り込みメカニズムの必要性
実時間処理
入力があったら,現在の処理を中断して,特別な処理を
直ちに行いたい.
システムの利用効率の向上
「入力が来たか」などを常に見張っているのはCPUの無
.割り込み機能を利用すれば,見張る必要なし.
オペレーティングシステムの実現
プログラムは普通のモード(ユーザモード)で動くが,オペ
レーティングシステムの機能を呼び出すときは,自動的に
スーパバイザモード(特権命令が実行可能になるような
特別なモードのことに切り替える
例外ベクタ方式
例外ベクタ番号
割り込みの種類ごと番号(例外ベクタ番号)が
決まっている
例外処理プログラムの開始アドレスの決定法
CPUは,例外ベクタ番号を使って,メモリ内の
定のアドレスを読み,例外処理プログラムの開始
アドレスを得る
あらかじめ,メモリの所定のアドレスに「例外処理
の開始アドレス」を書き込んでお
例外ベクタ方式
メモリ
アドレス
0000 0000
0000 0004
0000 0008
0000 000C
0000 0010
区画ごとにメモリアドレス
が入っている(32ビット)
例外ベクタ番号 0番用
例外ベクタ番号 1番用
例外ベクタ番号 2番用
例外ベクタ番号 3番用
例外ベクタ番号 4番用
例外ベクタ方式
プログラム
例外処理
(例外ベクタ番号10(16)番用)
割り込みの発生
(例外ベクタ番号10(16)とする)
メモリ
例外ベクタ番号
10(16)番用
0000 0040
例外処理
を呼び出す
例外処理
の開始アドレスを得る
ハードウエアリセットの場合
プログラム
例外処理
(ハードウエアリセット用)
ハードウエアリセットの発生
(例外ベクタ番号は「1」と決
まっている)
メモリ
例外ベクタ番号
1番用
0000 0004
ハードウエア
リセット用例外処理
を呼び出す
例外処理
サブルーチン
の開始アドレスを得る
ここまでのまとめ
割り込みの種類ごとに,所定の例外処理
が呼び出される仕組み
種類に応じて「ベクタ」が割り当てられている
割り込みの識別番号のこと
ベクタ番号と,例外処理プログラムの開始アド
レスの対応表がメモリ上にある
例外ベクタ番号: 0からF(16)
使うべきメモリ領域: 0から3FF(16
例外処理と
とスーパバイザモード
プログラム
例外処理「X」
例外処理「Y」
ふつうユーザモードで動く
スーパバイザモードで動く
処理を中断し,
例外処理「X
を呼び出す
処理を中断し,
例外処理「Y
を呼び出す
割り込み「X]の発生
割り込み「Y]の発生
スーパバイザモードとは
特権命令を実行可能なモード
ステータスレジスタ(68000CPU内のレジ
スタ)のSビットの値が
特権命令
システムの信頼性を高めるために,いくつかの
命令は特権化されている
68000では,
RESET リセット
move ・・・, %sr ステータスレジスタの書き換え
など
ユーザモードと
スーパバイザモードの違
ユーザモード
ステータスレジスタのSビットが0
特権命令を実行できない
スタックポインタとして,ユーザスタックポインタが使わ
れる
スーパバイザモード
ステータスレジスタのSビットが1
特権命令を実行できる
スタックポインタとして,スーパバイザスタックポインタ
が使われる
割り込み時の「モード」の変化
「割り込み」が発生すると:
スーパバイザモード(特権命令が実行可能になるよう
な特別なモードのこと)に遷移
所定の例外処理プログラムが呼び出される
プログラム実行の流れ
割り込みが発生すると,処理を中断し,
スーパバイザモードに遷移
元のモードに
戻り,処理を再開
例外処理
rte
rte は例外処理
からの復帰命令
割り込みの発生によって
何が行われるのか
通常のプログラム実行を中断
プログラムカウンタの値をシステムスタックに保存
ステータスレジスタの値もシステムスタックに保存
スーパバイザモードに遷移
ステータスレジスタ内の「S(スーパバイザ)」ビットを1
に書き換え
所定の例外処理を呼び出す
例外処理の開始アドレスの取得
プログラムカウンタ値の書き換え
例外処理からの復帰で何が
行われるのか
元のモードに遷移
システムスタックに保存されていた値を使って,
ステータスレジスタを元に戻す
通常のプログラム実行を再開
システムスタックに保存されていた値を使って,
プログラムカウンタを元に戻す
例外処理からの復帰命令: rte
通常のプログラム実行を中
メモリ
CPU
システム
スタック
領域
スタックポインタ
プログラムカウンタ
プログラムカウンタと
ステータスレジスタの
値がプッシュされる
値は6減る
ステータスレジスタ
32ビット長
16ビット長
スーパバイザモードに遷移
CPU
スタックポインタ
プログラムカウンタ
ステータスレジスタ
Sビット部
ステータスレジスタのSビット部
なら「ユーザモード」
なら「スーパバイザモード」
Sビット部が自動的に「1」に変わる
所定の例外処理を呼び出す
CPU
スタックポインタ
プログラムカウンタ
ステータスレジスタ
別の値に変わる
(何の値に変わるかは,割り込みの
種類によって違う)
元のモードに遷移
メモリ
CPU
システム
スタック
領域
スタックポインタ
プログラムカウンタ
ステータスレジスタの
値がポップされる
値は2増える
ステータスレジスタ
通常のプログラム実行を再
メモリ
CPU
システム
スタック
領域
スタックポインタ
プログラムカウンタ
プログラムカウンタ
の値がポップされる
値は4増える
ステータスレジスタ
ステータスレジスタ
16ビットの長さ
下半分にコンディションコードレジスタを含
コンディションコード
レジスタ部分
1ならば
スーパバイザモード
0ならば
ユーザモード
現在の
走行レベル
I0
I1
I2
13 10
ユーザスタックポインタと
スーパバイザスタックポインタ
68000 には,2個のスタックポインタがあり,モー
ドに応じて,使われるスタックポインタが決ま
プログラムでは,ふつう,単に %sp と書くだけ
ユーザスタックポインタ
スーパバイザスタックポインタ
ユーザモードで使用
スーパバイザモードで使用
トラップ命令
ユーザモード,スーパバイザモードという2つの
モードがあることが,オペレーティングシステムの
実現に必須
トラップ命令の使用法
「番号」を付ける
例) trap #0, trap #1
トラップ命令の機能
ユーザモードから,スーパバイザモードへの切り替え
(遷移)
「番号」に応じて,定められたプログラム(サブルーチ
ン)が自動的に呼び出される
トラップ命令
プログラム
trap #0
trap #1
rap #0
例外処理プログラム
rap #1
例外処理プログラム
ユーザモードで動
rte
rte
トラップ命令
でも,復帰
rte を使用
スーパバイザモードで動く
トラップ命令
でも,復帰
rte を使用
トラップ命令の用途
オペレーティングシステムの機能を呼び出すとき
トラップ命令を使う
通常,プログラムはユーザモードで動く
ユーザモードでは,「特権命令」が実行できないなどの
「保護」が働く
システムの資源のアクセスなどは,オペレーティ
ングシステムに依頼するという形を取る
オペレーティングシステムの機能は,トラップ命令で
び出され,スーパバイザモードで実行される
スーパバイザモードなので,ステータスレジスタの操
作など特権命令が実行可能
トラップ命令の使い方
「番号」は0から15まで
trap #0, trap #1 ..., trap #15
それぞれ,例外ベクタ番号は,20(16)
ら2F(16)まで
20, 21, ..., 2F(16)
ハードウエア割り込み
外部要因の割り込み
CPUの端子(IPL0,IPL1,IPL2)に信号が来ることで
発生
普通: 000 (3つとも0)
割り込み: 001, 010, 011, 100, 101, 110, 111
3ビットのビットパターン
「例外ベクタ番号」(例外の種類を表す番号)も,外部か
らの信号で受け取る
割り込みレベル
割り込みの優先度のこと
ハードウエア割り込み時の,CPUの端子(IPL0,
IPL1,IPL2)の信号ビットパターンで,1から
決まる
IPL0,IPL1,IPL 割り込みレベル
割り込みマスク
ステータスレジスタの3つのビット(I2,I1,I0)に,
現在の例外処理のレベルが入っている
より高レベルの割り込みのみを受け付ける
例) いま,ステータスレジスタの I2, I1, I0
「5」が入っているとしよう
ハードウエア割り込みが来ると
優先度が5以下: 無視される
優先度が6以上: 受け付ける
例外として,優先度7のものだけは,無視される
ことはない
I2, I1, I0 に「7」が入っていても,「6」が入っているの
と同じ
割り込み禁止
例) move #0x2700, %sr
ステータスレジスタの I2, I1, I0 を強制的に「7」
に設定
すると,優先度6以下のハードウエア割り込みは
無視されることになる
move #0x2400, %sr など,他の走行レベルに設
定することももちろん可能
意図的に I2, I1, I0 を書き換えることを「割り込み
禁止」という
I0
I1
I2
13 10
1
1
1
1
0
0
0
0
0
割り込み禁止の手順
ステータスレジスタを,システムスタックに保存
move.w %sr, -(%sp)
割り込み禁止
move.w #0x2700, %sr
割り込み禁止をやめてもよくなったら
ステータスレジスタの復帰
move.w (%sp)+, %sr
割り込みを禁止しておきたい」ときは
割り込み禁止の手順
プログラム
何かの例外処理プログラム
rte
割り込みの発生
例外処理
を呼び出す
move.w %sr, -(%sp)
move.w #0x2700, %sr
/* 割り込み禁止部 */
move.w (%sp)+, %sr
例外処理プログラム中では,しばしば,
割り込み禁止が必要になる