- ベストアンサー
コンピュータのベクタ番号について
割込み処理について勉強しているのですが、どうしても納得できない箇所があり質問させてください。 ベクタ番号の16と19って浮動小数点の例外割込みと定義されているのですが、ソフトウェア割込みのint 10hとint 13hはモニタ関連とディスク関連のBIOSに割り当てられています。 「int 10hはベクタ番号16」「int 13hはベクタ番号19」ではないのでしょうか。 基本的な質問で申し訳ありませんが、よろしくお願いいたします。
- みんなの回答 (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/interrupt_protect.html
その他の回答 (6)
- ralf124c
- ベストアンサー率52% (232/446)
遅くなってすいません。 > まずは、割込みベクタテーブルとしてBIOSのint 10hとベクタ番号16は同一の割込みハンドラを指しているという理解について正しいのか否かご教授頂けたらと思います。 ハンドラやBIOS云々は別として、理解はあっていると思います。 ただ、「Intelのマニュアル」に記載されていたと称される割り込みテーブルって具体的に何なのかが気になります。 あまり見かけない並びになっているので、どのCPUで何のシステムを使っているのか・・・。
補足
ご回答ありがとうございます。 参照しておりましたIntelのマニュアルは下記のものです。 http://download.intel.com/jp/developer/jpdoc/IA32_Arh_Dev_Man_Vol3_i.pdf このマニュアルの第5章と第16章です。 IA32アーキテクチャとしてのCPUが発行する例外割込みが解説されているのですが、よくよく読んでいくとベクタ番号16と19はコントロールレジスタなどのFPUとSSEが有効な場合にのみ例外として割込みを発行すると記載がありました。 よって現状の理解としてはBIOSやOSの割込みハンドラ内にてCPUの動作状態を判断してモニタ表示処理なのかFPUの例外処理なのかを振り分けているのではと考えています。 まったくトンチンカンな理解かもしれませんので、ご存知でしたらご教授ください。 尚、今の調査はCPUやOSを特定せず市場で使用されているパソコンとしての基本動作を調べていますので、メーカーやOSの種類などがお伝えできないことをご了承ください。 よろしくお願いいたします。
- Tacosan
- ベストアンサー率23% (3656/15482)
まず #1 の「システムに強く依存する」ってところを無視しないでほしい. これが PC/AT のことだってのはわかるけど, それを書かないでこんなふうに聞かれたら 「何を寝惚けてるの? うちの XBox はそんなふうになってないよ?」 って言われることを覚悟しないと. で本題については 8087 の割り込みがどう CPU に伝わるかを調べればわかるはずです. 単純にいえば「PC/AT では FPU の割り込みがベクタ16 にルートされていない」だけです.
- ralf124c
- ベストアンサー率52% (232/446)
さらにすいません 補足の補足です 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は同一の割込みハンドラを指しているという理解について正しいのか否かご教授頂けたらと思います。 よろしくお願いいたします。
- ralf124c
- ベストアンサー率52% (232/446)
すいません 補足です > 基本的に16進表記はされません と書きましたが、IRQの番号上での話で、割り込みをソフトから呼び出す場合、「int xxh」と16進表記で書くことが多いので、割り込みベクトル情報上は0からFまでの表記がされています。 要するに16と19ってのが何かの間違いかと思われます。
- ralf124c
- ベストアンサー率52% (232/446)
ハードウェア割り込みとソフトウェア割り込みがごっちゃになっているようです。 前者はハードウェア上のCPUの割り込み信号に対する外部機器からの割り込み番号でIRQはIBM-PCアーキテクチャ上で0から15までしか無いはずです。 基本的に16進表記はされません。 13が演算プロセッサの例外で10は予約となっています(OADGハードウェアテクニカルリファレンスより)。 後者は、BIOSルーチンで用意されたプログラムをメモリ上の一定領域(割り込みベクタテーブルにアドレスを割り振ったもの)から参照されてソフトウェア上で処理される割り込みです。 前者のイベントはハードウェアがトリガになりますが、後者はソフトつまりプログラムがトリガとなります。 もちろん、前者でイベント発生後に呼び出されるルーチンはソフトウェアになります。 OADG「http://www.oadg.or.jp/」の図書室をご参照ください。
- Tacosan
- ベストアンサー率23% (3656/15482)
割り込み処理とかベクタ番号とかはシステムに強く依存します. あなたはどのようなシステムについて話をしているのですか?
補足
ご回答ありがとうございます。 今は調査段階で、コンピュータのシステムBIOSからOSの起動処理について調べています。 ブート処理の中で、MBRやPBRなどはint 10hとint 13hを使用していると思いますがこれらが実行しているリアルモードでの浮動小数点に関する例外割込みは発生しないのでしょうか。 それとも、int 10hとint 13hに対するベクタ番号の理解が間違っているのでしょうか。 よろしくお願いいたします。
お礼
色々とご教授いただきありがとうございました。 教えて頂いたことを念頭にがんばります。また、納得いかないことがありましたら投稿させていただきますのでその際はよろしくお願いいたします。