• ベストアンサー

OSの割り込みについて

以下の各々の割り込みについて。 必要な処理を、なぜ他の方法ではなく、割り込みを通してOSに行ってもらうのか? よくわからなかったので、どなたか教えてください。 ・ハードウェアの誤り検出 ・入出力処理終了の報告 ・タイマ ・外部信号割り込み ・ソフトウェアの誤り検出 ・ページフォールト/アドレス変換例外 ・システムコール/カーネルコール

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

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

> 必要な処理を、なぜ他の方法ではなく、割り込みを通してOSに行ってもらうのか? 他の方法ってどんなのがあるのでしょうか? それに、割り込みとOSって必ずしも連動してるわけじゃないし関係の無い割り込みもあります。 それぞれに用途と必要性が有って生じたモノとしか言いようが無いです。 「この世の割り込みの存在意義」を問われているような広義の質問は、本一冊でも解説が困難な事項なので簡潔に説明は不可能かと思います。 8ビットのマイコンキット+OS制作から勉強した方が理解が早いかも知れません。 例外処理なんて言う類の割り込みじゃなくて、ハード関連の制作を少しでも行って直に触れてみればその有用性が多少なりとも理解でき視野も広がると思います。

その他の回答 (1)

回答No.2

> 必要な処理を、なぜ他の方法ではなく、割り込みを通してOSに行ってもらうのか? 誤解されている様に感じました。 そして、割り込みにも種類がありますし、状況に依ってかなり違います。 例えば、カーネルでポーリングする事もできるし割り込みによる動作にもできるディスクコントローラ使う場合の事を考えるとデバイスからカーネルへの部分がハードウェア割り込みになるかソフトウェアによるポーリングになるかの違いはあります。それとは別に、ユーザプログラムから見るとシステムコール・カーネルコールの割り込み(ソフトウェア割り込み)になります。 ※ 表現が変な気も。別の2つの処理が関係します。リング0で動いてないとデバイス(ハードウェア)へのアクセスはできません。 http://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%97%E3%83%AD%E3%83%86%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3 まず、ハードウェアへのアクセスは利用者権限ではできません。 ※ PC-DOS/MS-DOS/古いDOSを基盤に使っていたWindows(-WIndows3.1,95,98,Me)では正しくないです。NT系のWindowsや多くのOSでは正しいです。 そのためハードウェアへのアクセスが必要となった場合には割り込みを使ってシステム(OS)に作業を依頼します。 > ・システムコール/カーネルコール あるいは、ハードウェアが検出する場合もあります。 > ・ページフォールト/アドレス変換例外 (CPUもしくはMMU回路のハードウェア割り込み) > ・外部信号割り込み (ハードウェア[割り込みコントローラ]) > ・ハードウェアの誤り検出 (誤り検出をするデバイス) 不明なのも。 > ・ソフトウェアの誤り検出 (色々な場合が考えられる) > ・入出力処理終了の報告 (??? 例えば、ディスクをアクセスするシステムコールの終了もその一種だろうし) > ・タイマ (??? ソフトウェアタイマ・ハードウェアタイマ・………)

関連するQ&A

  • 割込みとページフォールト

    割込みとページフォールト ページフォールトについてwikipediaで見てみると、ハードウェアから発生するとあるのですが、ハードディスクから発生するなら、ページフォールトは外部割込みだとおもうのですが、違うようです。なぜなんでしょうか?

  • ページフォールトを発生させるメモリ管理ユニットとはCPUの中の部品なん

    ページフォールトを発生させるメモリ管理ユニットとはCPUの中の部品なんですか? ページフォールトについてwikipediaで見てみると、「ハードウェアが発生する割り込み」とあります。ハードウェア"から"発生するなら、ページフォールトは外部割込みだと思いました。しかし基本情報技術者の過去問によると違うようです。ページフォールトを発生させるメモリ管理ユニットとはもしかしてCPUの中の部品なんですか? ちなみにH18春問21です。

  • OSについて。

    情報の宿題で 「OSを次の語を使って説明しなさい。アプリケーションソフト、ハードウェア、システムコール」 という問題があるのですが、うまく文章をまとめられません・・・。 とりあえず、次のように考えてみたのですがどうでしょうか? あと、もっと簡単に説明する方法はないでしょうか? アドバイスお願いします。 OSとはコンピュータにおいてハードウェアへのインターフェースを抽象化してアプリケーションソフトに提供するソフトウェア。各ソフトウェアが個別に対応していては非合理なため、システムコールという処理を利用する。

  • 組み込みソフトウェアの割り込みについて、

    今組み込みソフトウェアについて、勉強している物です。 割り込みについて、分からないため質問させていただきます。 割り込みをする際は、何らかの操作により、割り込みカウンタにビットが入り、 それにより、PCに割り込みアドレスを入れられ、割り込み処理が実行されるとの事ですが、 何らかの操作により、割り込みカウンタにビットが入り、それに検出がよくわからないです。 ポーリングで、カウンタの値を見ている訳ではないのに、どうやって検出するのでしょうか? 私の解釈、憶測では、カウンタをハードウェアでポーリングしており、そのためソフトウェアでは意識する必要がないのでは?と認識しております。

  • Linuxソフトウェア割り込み

    Linuxの初心者です。 Linuxのソフトウェア割り込みはシステムコールによるものだと聞いています。 実際にシステムコールを利用した時に、いつ割り込みが行われ、ユーザ空間からカーネル空間に移行されたが分かりません。 何か確認する方法というものはあるのでしょうか? よろしくお願いします。

  • IC16F1829でのCCPモジュールについて

    PIC16F1829でのCCPモジュールを使用した、パルス幅のキャプチャについて 割込み関数を用いたら、mainループ内でCCP*IFを検知しません。状況: CCPモジュールを用いて、パルスの幅を計測しようとしています。CCP単独での動作では、パルス幅を計測できました。 ここでの「単独」とは、割り込み関数を用いないmainループ内での処理です。 //「単独」での仕様 // (1)CCP2モジュールでPWMパルスを発生する (2)上記パルスをCCP1で立下がり、CCP4で立上がり検出する (3)上記の値の差を計算 (4)I2C通信でLCDに表示 これで、タイマ1の分解能を1usに設定し、パルスのOFF時間を計測できました。 問題: PICにラインカメラを接続し、カメラの出力パルスOFF幅を計測したいのですが できません。 原因: mainループ内 if(CCP1IF){ } に処理が入らない。 質問: なせCCP1IFを検知できないのでしょうか。 割込み関数を入れると、検知できないようになってしましいます。 何か競合するのでしょうか。 PICでは割込み関数の処理が終わるまでは、ほかの割込み禁止なはずなので 下に書いてある、フローチャート通りにプログラムが動くはずなのですが・・ 私の力不足で、うまく動作しません。 後閑さんの本やPIC16F1829のデータシートも見ましたが原因がわかりません。 よろしくお願いします。 仕様(フローチャート): 概要 割込み関数は ・タイマ0 (CCP2のパルスカウント) キャプチャした値の計算とシリアル送信を行う ・タイマ4 (20ms周期でリセットパルスを生成) メイン関数は ・CCP1で立下りエッジ検出 ・CCP4で立上がりエッジ検出 ****** タイマ0の割込みは約13msです。 タイマ4は20msです。 時系列で言うと (1)プログラムスタート~タイマ0割込みまで(0~13ms) main関数が走り、パルスのエッジをキャプチャする (はずですが、現状CCP1IFを検知できません) (2)タイマ0割込み中(13~19.9ms) キャプチャの値の計算とシリアル送信 (3)タイマ4割込み発生(20ms) リセット信号と全ての値のクリア

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

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

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

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

  • C言語での例外処理の検出方法とは?

    下記Linux環境にて、C言語で例外処理を検出したいのですが 何か方法は有りますでしょうか? 回答するにあたり、不足な情報がございましたらご指摘ください。 環境&コンパイラ  RedHat 7.3 2.96-110  Kernel 2.4.18-3 on an i686  gcc 2.96  GNU Make 3.79.1

  • 2度目の投稿となります。

    2度目の投稿となります。 現在、社員研修でPIC18F2550を使ったプログラミングを行っているのですが、下記内容についてうまく動作しません。 大変恐縮ですが、原因についてアドバイス頂けますと幸いです。 作成環境はMPLAB V8.36、MPLAB C18コンパイラV3.33 です。 <質問内容> ◎タイマ1がうまく動作しない。 やりたい事は、  (1)タイマ0(8bit)を使い割り込みを発生させ、ポートから信号ON/OFF(PWM信号を出したい)。  (2)タイマ1(16bit)を使いCCP1/2のコンペアマッチ割り込みを行ない、CCP1ポートからPWM信号ON/OFF(サーボモータの動作用PWM信号を出したい)。 (1),(2)を同時進行で動作させたい、というものです。 シミュレーションで確認したところ、タイマ0/1のカウントアップ動作自体は確認できているのですが、タイマ1が8bitのところでオーバーフロー?して、タイマ0と同時に0にリセットされてしまいます。 以下に作成コードを掲載します。 --【以下、コード抜粋】-- //===《初期設定》=== //---<ヘッダーファイル>--- #include<p18f2550.h> //---<コンフィグレーション>--- //---<関数宣言>--- //---<割り込みの定義関連>--- //===《動作プログラム》=== //---<メイン関数>--- void main() { ioport_settei(); //サブルーチン「ioport_settei」実行(入出力ポート初期設定) interrupt_settei(); //サブルーチン「interrupt_settei」実行(割り込み初期設定) tmr_ccp_settei(); //サブルーチン「tmr_ccp_settei」実行(タイマ&CCPモード初期設定) while(1) //繰り返し(ずっと繰り返す) { } } //---<サブルーチン>--- void ioport_settei(void) //[入出力ポート初期設定] {省略} void interrupt_settei(void) //[割り込み初期設定] { INTCONbits.GIE = 1; //グローバル割り込み設定:許可 INTCONbits.PEIE = 1; //周辺割り込み設定:許可 INTCONbits.TMR0IE = 1; //タイマ0割り込み設定:許可 PIE1bits.TMR1IE = 1; //タイマ1割り込み設定:許可 PIE1bits.CCP1IE = 1; //CCP1割り込み設定:許可 PIE2bits.CCP2IE = 1; //CCP2割り込み設定:許可 } void tmr_ccp_settei(void) //[タイマ&CCPモード初期設定] { TMR0H = 0; TMR0L = 0; TMR1H = 0; TMR1L = 0; T0CON = 0b11001000; //タイマ0設定(有効,8bit,内部クロック,プリ1倍) T1CON = 0b10000001; //タイマ1設定(有効,16bit,内部クロック,プリ1倍) CCP1CON = 0b00001001; //CCP1設定(Compare mode,RC2=0,割り込み発生) CCP2CON = 0b00001011; //CCP2設定(Compare mode,スペシャルイベントトリガ,割り込み発生) CCPR1 = 3750; //CCP1 Duty値初期設定(PWM(ON時間)=1.5ms…ニュートラル位置) CCPR2 = 50000; //CCP2 Duty値初期設定(PWM(周期)=20ms) } //---<割り込み処理関数>--- #pragma code void isr(void) { if(INTCONbits.TMR0IF == 1) { INTCONbits.TMR0IF = 0; } } となります。 大変恐縮ですが、原因が判る方がいらっしゃいましたら、ご教示のほどよろしくお願い致します。