スライド 1: as-6. スーパーバイザモード,特権命令,割り込み
スライド 2: 到達目標
スライド 3: 割り込み発生時のCPUの挙動
スライド 4: 割り込みの発生
スライド 5: 割り込みの種類
スライド 6: 外部割り込みの例
スライド 7: 内部割り込みの例
スライド 8: 割り込みメカニズムの必要性
スライド 9: 例外ベクタ方式
スライド 10: 例外ベクタ方式
スライド 11: 例外ベクタ方式
スライド 12: ハードウエアリセットの場合
スライド 13: ここまでのまとめ
スライド 14: 例外処理と とスーパバイザモード
スライド 15: スーパバイザモードとは
スライド 16: 特権命令
スライド 17: ユーザモードと スーパバイザモードの違い
スライド 18: 割り込み時の「モード」の変化
スライド 19: 割り込みの発生によって 何が行われるのか
スライド 20: 例外処理からの復帰で何が 行われるのか
スライド 21: ① 通常のプログラム実行を中断
スライド 22: ② スーパバイザモードに遷移
スライド 23: ③ 所定の例外処理を呼び出す
スライド 24: ④ 元のモードに遷移
スライド 25: ⑤ 通常のプログラム実行を再開
スライド 26: ステータスレジスタ
スライド 27: ユーザスタックポインタと スーパバイザスタックポインタ
スライド 28: トラップ命令
スライド 29: トラップ命令
スライド 30: トラップ命令の用途
スライド 31: トラップ命令の使い方
スライド 32: ハードウエア割り込み
スライド 33: 割り込みレベル
スライド 34: 割り込みマスク
スライド 35: 割り込み禁止
スライド 36: 割り込み禁止の手順
スライド 37: 割り込み禁止の手順
as
-6.
スーパーバイザモード,
特権命令,割り込み
1
金子邦彦
(
68000
アセンブラプログ
ラミング)
URL:
https://www.kkaneko.jp/cc/as/index.ht
ml
到達目標
•
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
F
(16)
使うべきメモリ領域:
0から3FF
(16
)
例外処理と
とスーパバイザモード
プログラム
例外処理「X」
例外処理「Y」
ふつうユーザモードで動く
スーパバイザモードで動く
処理を中断し,
例外処理「
X
」
を呼び出す
処理を中断し,
例外処理「
Y
」
を呼び出す
割り込み「X]の発生
割り込み「Y]の発生
スーパバイザモードとは
•
特権命令を実行可能なモード
•
ステータスレジスタ(68000CPU
内のレジ
スタ)のSビットの値が
1
特権命令
•
システムの信頼性を高めるために,いくつかの
命令は特権化されている
68000
では,
RESET
リセット
move
・・・
, %sr
ステータスレジスタの書き換え
など
ユーザモードと
スーパバイザモードの違
い
•
ユーザモード
–
ステータスレジスタの
Sビットが0
–
特権命令を実行できない
–
スタックポインタとして,ユーザスタックポインタが使わ
れる
•
スーパバイザモード
–
ステータスレジスタの
Sビットが1
–
特権命令を実行できる
–
スタックポインタとして,スーパバイザスタックポインタ
が使われる
割り込み時の「モード」の変化
•
「割り込み」が発生すると:
–
スーパバイザモード(
特権命令が実行可能になるよう
な特別なモード
のこと)に遷移
–
所定の例外処理プログラムが呼び出される
プログラム実行の流れ
割り込みが発生すると,処理を中断し,
スーパバイザモードに
遷移
元のモードに
戻り
,処理を再開
例外処理
rte
rte
は例外処理
からの復帰命令
割り込みの発生によって
何が行われるのか
①
通常のプロ
グラム実行を中断
–
プログラムカウンタの値をシステムスタックに保存
–
ステータスレジスタの
値もシステムスタックに保存
②
スーパバイザモードに遷移
–
ステータスレジスタ内
の「S(スーパバイザ)」ビットを1
に書き換え
③
所定の
例外処理を呼び出す
–
例外処理の開始アドレスの取得
–
プログラムカウンタ値の書き換え
例外処理からの復帰で何が
行われるのか
④
元のモードに遷移
–
システムス
タックに保存されてい
た値を使って,
ステータスレジス
タを元に戻す
⑤
通常のプロ
グラム実行を再開
–
システムス
タックに保存されてい
た値を使って,
プログラムカウンタを元に戻す
例外処理からの復帰命令:
rte
①
通常のプログラム実行を中
断
メモリ
CPU
システム
スタック
領域
スタックポインタ
プログラムカウンタ
プログラムカウンタと
ステータスレジスタの
値がプッシュされる
値は6減る
ステータスレジスタ
32ビット長
16ビット長
②
スーパバイザモードに遷移
CPU
スタックポインタ
プログラムカウンタ
ステータスレジスタ
1
S
ビット部
ステータスレジスタの
S
ビット部
0
なら「ユーザモ
ード」
1
なら「スーパバイザモード」
S
ビット部が自動的に「1」に変わる
③
所定の例外処理を呼び出す
CPU
スタックポインタ
プログラムカウンタ
ステータスレジスタ
別の値に変わる
(何の値に変わるかは,割り込みの
種類によって違う)
④
元のモードに遷移
メモリ
CPU
システム
スタック
領域
スタックポインタ
プログラムカウンタ
ステータスレジスタの
値がポップされる
値は2増える
ステータスレジスタ
⑤
通常のプログラム実行を再
開
メモリ
CPU
システム
スタック
領域
スタックポインタ
プログラムカウンタ
プログラムカウンタ
の値がポップされる
値は4増える
ステータスレジスタ
ステータスレジスタ
•
16ビットの長さ
•
下半分にコンディションコードレジスタを含
む
コンディションコード
レジスタ部分
1ならば
スーパバイザモード
0ならば
ユーザモード
現在の
走行レベル
S
I0
I1
I2
C
V
Z
X
N
13
10
9
8
4
3
2
1
0
ユーザスタックポインタと
スーパバイザスタックポインタ
•
68000
には,2
個のスタックポインタがあり,モー
ドに応じて,使われるスタックポインタが決ま
る
•
プログラムでは,ふつう,単に
%sp
と書くだけ
ユーザスタックポインタ
スーパバイザスタックポインタ
ユーザモードで使用
スーパバイザモードで使用
トラップ命令
•
ユーザモード,スーパバイザモードという2つの
モードがあることが,オペレーティングシステムの
実現に必須
•
トラップ命令の使用法
–
「番号」を付ける
例)
trap #0, trap #1
•
トラップ命令の機能
–
ユーザモードから,スーパバイザモードへの切り替え
(遷移)
–
「番号」に応じて,定められたプログラム(サブルーチ
ン)が自動的に呼び出される
トラップ命令
プログラム
trap #0
trap #1
t
rap #0
用
例外処理プログラム
t
rap #1
用
例外処理プログラム
ユーザモードで動
く
rte
rte
トラップ命令
でも,復帰
に
rte
を使用
スーパバイザモードで動く
トラップ命令
でも,復帰
に
rte
を使用
トラップ命令の用途
•
オペレーティングシステムの機能を呼び出すとき
トラップ命令を使う
•
通常,プログラムはユーザモ
ードで動く
–
ユーザモードでは,「特権命令」が実行できないなどの
「保護」が働く
•
システムの資源のアクセスなどは,オペレーティ
ングシステムに依頼するという形を取る
–
オペレーティング
システムの機能は,トラップ命令で
呼
び出され,スーパバイザモードで実行される
–
スーパバイザモードなので,ステータス
レジスタの操
作など特権命令が実行可能
トラップ命令の使い方
•
「番号」は0から15まで
trap #0,
trap #1
...,
trap #15
•
それぞれ,例外ベクタ番
号は,20
(16)
か
ら2F
(16)
まで
20, 21,
..., 2F
(16)
ハードウエア割り込み
•
外部要因の割り込み
•
CPUの端子(IPL0,IPL
1,IPL2)に信号が来ることで
発生
普通:
00
0 (
3つとも0
)
割り込み:
001, 010, 011, 100, 10
1, 110, 111
3ビットのビットパターン
•
「例外ベクタ番号」(例外の種類を表す番号)も,外
部か
らの信号で受け取る
割り込みレベル
•
割り込みの
優先度
のこと
•
ハードウエア割り込み時の,CP
Uの端子(IPL0,
IPL1,IPL2)の信号ビットパターンで,
1から
7
に
決まる
IPL0,IPL1,IPL
2
割り込みレベル
0
0
1
1
0
1
0
2
0
1
1
3
1
0
0
4
1
0
1
5
1
1
0
6
1
1
1
7
割り込みマスク
•
ステータスレジスタの3つのビット
(I2,I1,I
0)に,
現在の例外処理のレベルが入っている
•
より高レベルの割り込みの
みを受け付ける
例)
いま,ステータスレジスタの
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
を書き換えることを「割り込み
禁止」という
S
I0
I1
I2
C
V
Z
X
N
13
10
9
8
4
3
2
1
0
1
1
1
1
0
0
0
0
0
割り込み禁止の手順
•
ステータスレジス
タを,システムス
タックに保存
move.w %sr
, -(%sp)
•
割り込み禁止
move.w #0x2
700, %sr
割り込み禁止をやめてもよくなったら
,
・
ステータスレジスタの復帰
move.w (%sp
)+, %sr
割り込みを禁止しておきたい」ときは
割り込み禁止の手順
プログラム
何かの例外処理プログラム
rte
割り込みの発生
例外処理
を呼び出す
move.w %sr
, -(%sp)
move.w #0x2700, %sr
/*
割り込み禁止部
分
*/
move.w (%sp)+, %sr
例外処理プログラム中では
,しばしば,
割り込み禁止が必要になる