No.7ベストアンサー
- 回答日時:
文献を見てやっと意味がわかったように思います。
自分もWindows時代になってからBIOSコールやファンクションコールがAPIに置き換わってからというもの、あまり深く掘り下げてはいないので浅学なため間違いもあるかも知れませんがご了承を。
要するに、IntelのCPUアーキテクチャに80286からプロテクトモードというのが搭載されてアプリの階層を設けてシステムを安全に運用しようという機能を付けた時点で、それ以前のアーキテクチャであるリアルモードでのメモリマップががらりと変わって、BIOSコールに代表される旧アーキテクチャの固定テーブルによる割り込みベクタというのが追いやられてエミュレーションという形でフォローされている(メモリ上に複製されるのでOS側でパッチをあてたりしてた時代もあった)ようなのですが、そういった意味でnihon-jinさんの理解はどちらのモードも同じものとしてみていられるのではないでしょうか。
DOSやリアルモードオプションの付いたWindows3(懐かしいー \^o^ /)なんかでは、メモリマップ上にBIOSやOADGにあるベクターテーブルがたしかに存在していたのですが、80386以上が主流になって(80286まではモードの切り替えには再起動が必要だった:SEGAのTeraDriveというマシンではちょっと変則的でしたが)、立ち上げ時以外はあまり意識しなくなったというか、割り込みベクタを云々するその手のプログラミングは主流からはずれていったのでこの辺に詳しい方は結構少ないのではないかと思います。
すいません、昔の慣習でリアルモードとかプロテクトモードとか言う単語を使いましたが、ご提示のマニュアルで言うところの
保護モード=プロテクトモード
実アドレスモード=リアルモード
となります。
プロテクトモードで動作しているソフトウェアにとっての割り込みテーブルと、リアルモードで動作しているソフトウェアにとっての割り込みテーブルは、同じものではないということですね。
リアルモードの割り込みはご存知のようですので、プロテクトモードの割り込みに関してこのページに解説が役に立つかと思います
図の少し前の解説でテレコになってるので戸惑いますがそこさえ気をつければ図も多くわかりやすいかと思います
http://caspar.hazymoon.jp/OpenBSD/annex/interrup …
色々とご教授いただきありがとうございました。
教えて頂いたことを念頭にがんばります。また、納得いかないことがありましたら投稿させていただきますのでその際はよろしくお願いいたします。
No.6
- 回答日時:
遅くなってすいません。
> まずは、割込みベクタテーブルとしてBIOSのint 10hとベクタ番号16は同一の割込みハンドラを指しているという理解について正しいのか否かご教授頂けたらと思います。
ハンドラやBIOS云々は別として、理解はあっていると思います。
ただ、「Intelのマニュアル」に記載されていたと称される割り込みテーブルって具体的に何なのかが気になります。
あまり見かけない並びになっているので、どのCPUで何のシステムを使っているのか・・・。
この回答への補足
ご回答ありがとうございます。
参照しておりましたIntelのマニュアルは下記のものです。
http://download.intel.com/jp/developer/jpdoc/IA3 …
このマニュアルの第5章と第16章です。
IA32アーキテクチャとしてのCPUが発行する例外割込みが解説されているのですが、よくよく読んでいくとベクタ番号16と19はコントロールレジスタなどのFPUとSSEが有効な場合にのみ例外として割込みを発行すると記載がありました。
よって現状の理解としてはBIOSやOSの割込みハンドラ内にてCPUの動作状態を判断してモニタ表示処理なのかFPUの例外処理なのかを振り分けているのではと考えています。
まったくトンチンカンな理解かもしれませんので、ご存知でしたらご教授ください。
尚、今の調査はCPUやOSを特定せず市場で使用されているパソコンとしての基本動作を調べていますので、メーカーやOSの種類などがお伝えできないことをご了承ください。
よろしくお願いいたします。
No.5
- 回答日時:
まず #1 の「システムに強く依存する」ってところを無視しないでほしい. これが PC/AT のことだってのはわかるけど, それを書かないでこんなふうに聞かれたら
「何を寝惚けてるの? うちの XBox はそんなふうになってないよ?」
って言われることを覚悟しないと.
で本題については 8087 の割り込みがどう CPU に伝わるかを調べればわかるはずです. 単純にいえば「PC/AT では FPU の割り込みがベクタ16 にルートされていない」だけです.
参考URL:http://stackoverflow.com/questions/1634680/irq-n …
No.4
- 回答日時:
さらにすいません
補足の補足です
HW割り込みは16個とのたまわってしまいましたがそれは初期型(XT機)で、AT機から2番目の8259が1個分の8個追加されてます。
今はもう8259は使われていませんが・・・。
この回答への補足
色々とご教授頂きありがとうございます。
OADGの資料も拝見させていただきました。
しかし、まだしっくりと来ないのですが、OADG資料の割込みベクトルテーブルに記述されている「割込みタイプ」とIntelのマニュアルにある「ベクタ番号」は同じ意味合いに思います。以下にIntelのマニュアルを抜粋します。
ベクタ番号│説明
0 │ 除算エラー
1 │予約済み
2 │NMI割り込み
3 │ブレークポイント
4 │オーバーフロー
5 │BOUNDの範囲外
6 │無効オペコード
7 │デバイス使用不可
8 │ダブルフォルト
9 │コプロセッサ・セグメント・オーバーラン
10 │無効TSS
11 │セグメント不在
12 │スタック・セグメント・フォルト
13 │一般保護
14 │ページフォルト
15 │(インテルがすでに予約済み。使用禁止)
16 │x87FPU浮動小数点エラー
17 │アライメント・チェック
18 │マシンチェック
19 │SIMD浮動小数点例外
20-31 │(インテルがすでに予約済み。使用禁止)
32-255 │ユーザー定義(非予約)割り込み
内容として合致する箇所もあるのですが、例えばBIOSのint 10hはベクタ番号16と同じ割り込みハンドラにJMPするとしか思えず、この理解があっているとすると上記表の例外割込みとの違いをどのように判断するのかが分かりません。
まずは、割込みベクタテーブルとしてBIOSのint 10hとベクタ番号16は同一の割込みハンドラを指しているという理解について正しいのか否かご教授頂けたらと思います。
よろしくお願いいたします。
No.3
- 回答日時:
すいません
補足です
> 基本的に16進表記はされません
と書きましたが、IRQの番号上での話で、割り込みをソフトから呼び出す場合、「int xxh」と16進表記で書くことが多いので、割り込みベクトル情報上は0からFまでの表記がされています。
要するに16と19ってのが何かの間違いかと思われます。
No.2
- 回答日時:
ハードウェア割り込みとソフトウェア割り込みがごっちゃになっているようです。
前者はハードウェア上のCPUの割り込み信号に対する外部機器からの割り込み番号でIRQはIBM-PCアーキテクチャ上で0から15までしか無いはずです。 基本的に16進表記はされません。 13が演算プロセッサの例外で10は予約となっています(OADGハードウェアテクニカルリファレンスより)。
後者は、BIOSルーチンで用意されたプログラムをメモリ上の一定領域(割り込みベクタテーブルにアドレスを割り振ったもの)から参照されてソフトウェア上で処理される割り込みです。
前者のイベントはハードウェアがトリガになりますが、後者はソフトつまりプログラムがトリガとなります。
もちろん、前者でイベント発生後に呼び出されるルーチンはソフトウェアになります。
OADG「http://www.oadg.or.jp/」の図書室をご参照ください。
No.1
- 回答日時:
割り込み処理とかベクタ番号とかはシステムに強く依存します. あなたはどのようなシステムについて話をしているのですか?
この回答への補足
ご回答ありがとうございます。
今は調査段階で、コンピュータのシステムBIOSからOSの起動処理について調べています。
ブート処理の中で、MBRやPBRなどはint 10hとint 13hを使用していると思いますがこれらが実行しているリアルモードでの浮動小数点に関する例外割込みは発生しないのでしょうか。
それとも、int 10hとint 13hに対するベクタ番号の理解が間違っているのでしょうか。
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java Java 配列<選挙> 4 2023/07/31 15:07
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# 変数のスコープ 5 2023/05/27 17:50
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スーパーのレジで並んでいたら...
-
CPUの処理量を減らすコーデ...
-
PICでタイマー割込み(mikroC V...
-
C言語について(PWM)
-
PICの割り込み機能
-
割り込み処理のシミュレート
-
picタイマ0割り込みについて
-
電車で待機列の割り込みについ...
-
PICで既定の時間数ループを...
-
割り込みについて
-
割り込みの衝突
-
音声ファイル再生時のフリーズ
-
アセンブラのタイマー割り込み
-
ショッピング
-
H8マイコンで割り込みが任意の...
-
順番待ちで並んでいる時、割り...
-
VB6でSendKeyを利用したTab移動...
-
駅のトイレでナイチンに邪魔さ...
-
Macターミナルで実行中のプログ...
-
緯度、経度の 10進法と 60進法...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
インバウンドで迷惑している人...
-
pic 複数の割り込み関数 切り分...
-
スーパーのレジで並んでいたら...
-
ショッピング
-
Excelでタイマーの一時停止する...
-
電車で待機列の割り込みについ...
-
CPUの処理量を減らすコーデ...
-
C言語でPICマイコン開発
-
【組込み】割り込み中のstatic...
-
Amazonfireタブレットにわから...
-
マイコン C言語 割り込み処理...
-
USB機器からのデータ受信による...
-
一定時間操作がなかったら、と...
-
VB.net 割り込みの禁止
-
ウォッチドッグタイマ(WDT)の...
-
電車乗車時、並んでいるのに割...
-
USJでの割り込み
-
VB6でSendKeyを利用したTab移動...
-
PICでのプログラムによるチャタ...
-
割り込み中に例外異常
おすすめ情報