• ベストアンサー

コンピュータのベクタ番号について

割込み処理について勉強しているのですが、どうしても納得できない箇所があり質問させてください。 ベクタ番号の16と19って浮動小数点の例外割込みと定義されているのですが、ソフトウェア割込みのint 10hとint 13hはモニタ関連とディスク関連のBIOSに割り当てられています。 「int 10hはベクタ番号16」「int 13hはベクタ番号19」ではないのでしょうか。 基本的な質問で申し訳ありませんが、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ralf124c
  • ベストアンサー率52% (232/446)
回答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/interrupt_protect.html

nihon-jin
質問者

お礼

色々とご教授いただきありがとうございました。 教えて頂いたことを念頭にがんばります。また、納得いかないことがありましたら投稿させていただきますのでその際はよろしくお願いいたします。

その他の回答 (6)

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.6

遅くなってすいません。 > まずは、割込みベクタテーブルとしてBIOSのint 10hとベクタ番号16は同一の割込みハンドラを指しているという理解について正しいのか否かご教授頂けたらと思います。 ハンドラやBIOS云々は別として、理解はあっていると思います。 ただ、「Intelのマニュアル」に記載されていたと称される割り込みテーブルって具体的に何なのかが気になります。 あまり見かけない並びになっているので、どのCPUで何のシステムを使っているのか・・・。

nihon-jin
質問者

補足

ご回答ありがとうございます。 参照しておりました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)
回答No.5

まず #1 の「システムに強く依存する」ってところを無視しないでほしい. これが PC/AT のことだってのはわかるけど, それを書かないでこんなふうに聞かれたら 「何を寝惚けてるの? うちの XBox はそんなふうになってないよ?」 って言われることを覚悟しないと. で本題については 8087 の割り込みがどう CPU に伝わるかを調べればわかるはずです. 単純にいえば「PC/AT では FPU の割り込みがベクタ16 にルートされていない」だけです.

参考URL:
http://stackoverflow.com/questions/1634680/irq-numbering-conflict
  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.4

さらにすいません 補足の補足です HW割り込みは16個とのたまわってしまいましたがそれは初期型(XT機)で、AT機から2番目の8259が1個分の8個追加されてます。 今はもう8259は使われていませんが・・・。

nihon-jin
質問者

補足

色々とご教授頂きありがとうございます。 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)
回答No.3

すいません 補足です > 基本的に16進表記はされません と書きましたが、IRQの番号上での話で、割り込みをソフトから呼び出す場合、「int xxh」と16進表記で書くことが多いので、割り込みベクトル情報上は0からFまでの表記がされています。 要するに16と19ってのが何かの間違いかと思われます。

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.2

ハードウェア割り込みとソフトウェア割り込みがごっちゃになっているようです。 前者はハードウェア上のCPUの割り込み信号に対する外部機器からの割り込み番号でIRQはIBM-PCアーキテクチャ上で0から15までしか無いはずです。 基本的に16進表記はされません。 13が演算プロセッサの例外で10は予約となっています(OADGハードウェアテクニカルリファレンスより)。 後者は、BIOSルーチンで用意されたプログラムをメモリ上の一定領域(割り込みベクタテーブルにアドレスを割り振ったもの)から参照されてソフトウェア上で処理される割り込みです。 前者のイベントはハードウェアがトリガになりますが、後者はソフトつまりプログラムがトリガとなります。 もちろん、前者でイベント発生後に呼び出されるルーチンはソフトウェアになります。 OADG「http://www.oadg.or.jp/」の図書室をご参照ください。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

割り込み処理とかベクタ番号とかはシステムに強く依存します. あなたはどのようなシステムについて話をしているのですか?

nihon-jin
質問者

補足

ご回答ありがとうございます。 今は調査段階で、コンピュータのシステムBIOSからOSの起動処理について調べています。 ブート処理の中で、MBRやPBRなどはint 10hとint 13hを使用していると思いますがこれらが実行しているリアルモードでの浮動小数点に関する例外割込みは発生しないのでしょうか。 それとも、int 10hとint 13hに対するベクタ番号の理解が間違っているのでしょうか。 よろしくお願いいたします。

関連するQ&A

  • ベクタアドレスとは?

    マイコン勉強中の者です。 割り込みが発生するとあらかじめ決められたアドレスを参照する、というのは理解できました。 H8/3694の場合、リセット割り込みのベクタ番号は0で、ベクタアドレスは【H"0000~H"0001】と記載されています。 この【H"0000~H"0001】がよくわかりません。 このH0001またはH0001を参照するとリセット処理(パワーオンリセット?)のプログラムが書かれているんだと解釈しています。 では、H"0000を参照?それともH"0001を参照?どちら?と考えてしまいます。 恐らく私の考え方が間違っているのだと思うのですが・・・。 【H"0000~H"0001】の意味を御教授ください。 よろしく御願いいたします。

  • 割り込みベクタの機能と実現方法

    (d)割込ベクタの機能と実現方式を説明せよ。 (1)機能 割り込みには、ハードウェア割り込み、ソフトウェア割り込みがあるが、割り込みベクタによって、どのような割り込みが発生したかが分かるようになっている。割り込みの発生要因によって、実行される処理(割り込みハンドラーと呼ばれたりサービスルーチンと言われる)はシステムによって決められている。 (2)実現方法 ベクタテーブルを作成する必要がある。以下それについて具体的に説明する。 多数の割り込み要因がある場合,それぞれに対応する割り込みサービス・ルーチンを作っておく必要がある.そして,割り込み要求信号が発生したときには,要求を出している要因に応じて,正しい割り込みサービス・ルーチンを呼び出さなければならない.そのために用いられるのが割り込みベクタ・テーブルである.それぞれの割り込み要因は,割り込みが受け付けられると,割り込み元を示す番号(割り込みベクタ)を送信する.メモリの中には,この番号と割り込みサービス・ルーチンの先頭アドレス(あるいはそのアドレスへの分岐命令)を対応付けた表(テーブル)を用意しておく.この対応表を,割り込みベクタ・テーブルと呼ぶ.  割り込みは元のソフトウェアの実行を強制的に中断してしまう.このため,特に中断されたくない処理を実行している場合には,その間だけ割り込みを禁止にする機能がある.  また,割り込み要因の中には,割り込み要求を常時有効にしたい要因もあるが,特定の局面でだけ有効にしたい要因もある.そのため,各割り込み要因ごとに,割り込みの受付を無効にする割り込みマスクの機能がある.割り込みマスクで無効にできる割り込みはマスカブル割り込み,割り込みマスクで無効にできない割り込みをノン・マスカブル割り込み(NMI)と呼ぶ.  特に緊急性が高い割り込みにはNMIを用いる. いかがでしょうか? 実現方法のところが答えられていますでしょうか?

  • 割り込みベクタに飛んだ場合必ず”OSIntEnter();”という関数は使わないといけない?

    今、H8S2368のために書かれたプログラムを見ているのですが、このプログラムではuC/OSというプログラムの関数である"OSIntEnter();"という関数が出てくることがわかりました。それで、OSIntEnter()関数というのが現在のソースプログラムの中でどのように使われているのかを、全ソースに対して検索をかけてみたところ、必ずと言っていいほど割り込みベクタのプログラムである下記のようなプログラムで使われていることがわかりました。 __interrupt(vect=22) void INT_IRQ6(void) { OSIntEnter(); OSSemPost(CmxInt); OSIntExit(); } たぶん、割り込みが発生して、その割り込みの種類の割り込みベクタに飛ぶときにこの”OSIntEnter()”というのを使わなければならないのだろうと推測しているのですが、 もし、割り込みベクタで”OSIntEnter()”を使わなかった場合、どのような問題がおきるのでしょうか?

  • 固定長なデータ型の定義

    int型などは可変長型なのでサイズは16ビット、32ビット、 64ビットなどC言語だと環境によって異なってきますよね? さらにlong型は32ビット64ビットの可変長でも、 long long型は64ビット固定長型であったり、 long int型は32ビットが保証値だとか、 shortを付けるとサイズが小さくなるのかだとか、 非常に煩わしいのでどの環境でも常に同じサイズで定義できるよう 全てtypedefで固定長にしたいと考えています。 (できれば__int32等は言語仕様では無いので使いたくないので…) ですが検索するとどうも情報が各サイトごとに微妙に違ってたりして 私には正しいかどうかの判断が付かなくなってしまいました。 (C言語以外もあったのでそのせいかもしれませんが;) 以下のように、8ビット、16ビット、32ビット、64ビット、 32ビット浮動小数、64ビット浮動小数を定義したいのですが どうかアドバイスをいただけないでしょうか? 宜しくお願い致します typedef int8   signed char; // -127~127 typedef int16  //16ビット固定整数 typedef int32  //32ビット固定整数 typedef int64  //64ビット固定整数 typedef dec32  //32ビット固定浮動小数 typedef dec64  //64ビット固定浮動小数

  • STL vectorの初期化

    STL vectorの初期化についてなんですが 以下のようなクラスのprivateなメンバ変数としてvectorを定義し それをメソッド内のループ処理にて初期化しながら使用したいのですが 初期化の仕方が分かりません。コンストラクタを呼べば初期化されるようですが 以下のようにヘッダとソース内で2度同じような宣言をしてしまっても問題ないのでしょうか? //=== test.h === class test { private : vector<int> array; public : int fnc(); }; //=== test.c === int fnc() { for (int i = 0; i < 10; i++) { //★ここで初期化したい vector<int> array;  ←これで問題ないか? for (int j = 0; j < 10; j++) { array.push_back( md ); } } } C#などでは宣言とインスタンス生成を別に分けられたのですがC++も同様の事が出来るのでしょうか? 一応「array = new vector<int>;」といれて見たのですがエラーが出ました。

  • 割り込みベクターをC言語で書きたい

     皆さん、有難う御座います。時々質問させて頂いています。  今回は、ベクターアドレスをC言語で書く方法について質問します。  ルネサスのH8マイコンを使っています。モニターを使うとRAM上に割り込みの仮想ベクターを作れます。  仮想ベクターには、割り込みのジャンプ先アドレスが書かれます。  現在アセンブラで書いているのですが、C言語で書く方法は無いでしょうか。  二つの方法で書きたいと思っています。  アセンブラで次の二つの方法に相当するC言語命令を知りたい。 (1)ORGとEQU命令を使った方法 (2)ムーブ(Z80ならロード)命令で関数のアドレスをメモリに書く方法  ルネサスにはHEWと言うソフトが有りますが、HEW特有の命令によらず、一般的なコンパイラが持っている機能で実現したい。  以上宜しくお願いします。

  • Access97 Int関数

    小数点の切り捨てをしたくてクエリーで 以下の計算をしてみました。 =Int([個数]*[単価]) ところが以下の数値で計算させると結果が 50232となると思うのですが50231となってしまいます。 数量:460 単価:109.2 結果:50231(電卓で計算すると50232) 結果が小数点になるときは問題ないようです。 使い方が間違っているのでしょうか。 こういう場合Int関数を使うのが誤りなのでしょうか? だとしたら他に当てはまる関数があるのでしょうか? ちなみにテーブルの定義としては 数量:長整数型(小数点以下桁数0) 単価:単精度浮動小数点型(小数点以下桁数0) となっていますが小数点は表示されています。

  • Vectorから一部分を取り出す方法はありますか?

    教えていただきたいのですが、 1つのVectorの中に、いろいろなモノ(例えば、番号、名前、年齢のデータなど) が入っていたとして、そのVectorから番号だけ取り出して表示するなどということはできるでしょうか? /* 番号、名前、年齢を取得するメソッド(Vectorが戻り値)があるとして.... */ Vector vec = new Vector() ; str = number+name+age ; //これがたくさんあるとします vec.add(str) ;//番号と名前と年齢の組み合わせをVectorに格納 return vec ; /* 取りだし */ Vector vec=new Vector() ; vec = getVector() ; //メソッドから値を取りだし for(int i=0;i<vec.size();i++) { System.out.println(vec.elementAt(i)) ; } こんな感じだと、全部表示されてしまいます.... 部分ごとに取り出す方法はないでしょうか?初歩的な質問でごめんなさい、 よろしくお願いします!

    • ベストアンサー
    • Java
  • H8/OSを用いた割り込みで困っています。

    SH2-7045Fを用いて、MTUのTGRAとTNCTのコンペアマッチで割り込みを発生させたいのですが、かなり困っています。まず、MTUのTGRAの割り込みが発生したときの、割り込み関数の割り込み定義を、H8/OSにかいてあった、int_registでやっているのですが、これでいいのですか?あと、開発環境は、秋月でSH2を買ったときについてくるgccを使っていいるのですが、この中には割り込みマスクの設定の関数がないというのを知り、適当にインターネットから拾ったアセンブリ言語で書かれたようなもの(setIntmask())を書いているのですが、プログラムを動かしたとき割り込みを1度しか受け付けないでプログラムがおわらないで、なにかしています。教えてくださいお願いします。

  • MySQLの浮動小数点の定義について

    いまMySQLの浮動小数点の定義を行っているのですが, ↓↓↓↓↓ create talbe [table_name]( id int not null auto_increment, data1 double [(1)], primary key(id) ); の(1)のdouble型の精度の宣言方法が分かりません…。 どうやって宣言すればいいのか教えていただけませんか? 具体的に例を挙げていただけたら幸いです。