#5 割り込み処理をやる

さてさて、サボり気味のこのマガジンを更新。
今回は、割り込み処理についてまとめてみよう。

テキスト

いつもお世話になっている。メチャクチャ良い本。


1. 割り込み処理とは?

  割り込み処理の仕組みがどうなっている云々の前に、割り込み処理とは何ぞやということについて説明をしたいと思う。
 古に書いた#3のマガジン、PCI・USBドライバ作成の話に少し戻る。一応リンクを張ってみたものの、今回の話は全部目を通さなくても大丈夫。 

 ここで理解してもらいたいのは、USBやPCI(PC内部で使うUSBみたいなやつ)などで接続された機器からくるイベントを読み取るのは面倒くさいということ。面倒くさい――ここでは手間・処理が多いということだが、これは取りも直さず複雑な計算を要し、時間がかかる処理ということなのだ!

 この面倒くさいイベントを受け取ってマウスやキーボードを認識するということは、CPU君は常にイベントが発生するか否かを見守っていないといけないことになる。そうするとCPUの計算パワーを最大限引き出せないどころか、OSがまともに動かないなんて言う本末転倒なことも。OSを動かすためにUSBを使えるようにしたのに…

 この本末転倒を解消するのが割り込み処理というもの。これを考えた先人は素晴らしい。発想としては簡単。USBやPCI経由でイベントが来たときに反応して処理を行えばいい。これだけ。

 身近な例えでいえば電子レンジなんかが近い気がする。割り込み処理を実装しないということは、電子レンジに食材を入れボタンを押した後、ガラスに顔を押し付けて常に中身を監視している状態に近い。完成した状態を眼で見極めて取り出す…..  現実に電子レンジをこんな使い方するやつはまずいない。電子レンジで調理している間に別のことをしたほうがいいに決まっている。YoutubeやTwitterを見るでもいいし、ほかの料理の作業を進めるするなりなんでもいい。他のことをする。何と言ったて、電子レンジが「チン!」と鳴るまでは放っておけばいいのだから!

 割り込み処理を実装するということは、CPUが「チン!」を聞けるようにしてやって、電子レンジが動いている間はほかのことをさせようという企みなのである。

2. 実際に実現するには

  ここまで割り込み処理とは如何なるものかを、俯瞰的に説明してきた。が、実際問題どうやって実現させるのか?それをここで書いていきたい。
  といってもやり方はCPUの仕様に依存してしまいます。今回のテキストはx86-64というCPUの規格をターゲットにしてますが、細かいこと抜きで大まかな概要を書く。(仔細を書けるほど深い知見がないのは秘密)

2.1 ハンドラの作成

  まずハンドラー、つまり割り込み処理の中身を書いていきます。例えばキーボード。キーボードはコンピュータに文字を入力するための道具ですから、入力された文字を読み取る必要があるとわかります。なのでハンドラの中身としては、入力された文字を読み取る機能があればOK。という感じで実際に何をするかを書きます。形式としては関数で。

2.2 IDTを作る

  IDTとは割り込み記述子テーブルのことだ!….ということで、割り込み記述子テーブですよ。みなさん。これはハンドラを登録する表のようなものです。さっき作ったハンドラを、ベクタとして登録します。
  IDTには割り込みの種類ごとに割り当てた数字とハンドラの関数ポインタを登録しておきます。つまりベクタ = 割り当てられた数字 + 関数ポインタ という形。


より深く理解したい人は以下もどうぞ

 いきなりチョー技術的な話でしたが、つまりどういうことなのか。まず関数ポインタってなにってところですね。これはほぼ関数そのものだと思って構わないと思います。関数のアドレスのことです。

 ポインタに近い例としては 本に着けられるISBNをイメージしてもらうと分かりやすかも。本屋に並んでいる本にはISBNという番号が一つずつ割り振られています。本に対して一個ずつばらばらな番号が割り振られています。なんとこれを知っているだけで本が簡単に検索できる!というものです。

  これのプログラム版がポインタです。ポインタがあれば、とりあえずポインタで持っておいて、必要な時に取りに行くという方式ができるわけです。
  本でいえばISBNをメモっといて、買いたい時に取りにいく感じ。ISBNが手元にあれば、重い本をもって回らなくても後で取りに行くことができるので荷物がラクになります。そのあいだに他の本を見たりできるわけです。(まぁ、見回っている間に他の人に取られたら….)

 プログラムでもなるべく荷物(=データ)をラクにしたいので、ポインタを使います。今回であれば関数を丸ごとテーブルに登録すると、テーブルが膨大になってしまい処理に時間がかかったり、無駄にメモリを食ったりしちゃう。のでポインタを使うわけです。


つまり、IDTとはイベントがあったらとりあえず見る表デス。

2.3 CPUにIDTの場所を教えてあげる

 まぁ、タイトル通りです。場所を教えてあげるだけです。実はCPU君、「チン!」を聞く能力、元から持ってます。
 CPUはメモリの中の特定の部分に書き込みがあった場合、それをイベント通知(=「チン!」)として扱うことができるのです。なんて便利なんだ。ということで、CPUにIDTの場所を教えておけば

  1.  イベントがメモリに書き込まれる(「チン!」となる)

  2.  CPUが反応する(聴く)

  3.  IDTをCPUがチェック

  4.  ハンドラを実行!

という形で実行されます。イヤーほんとに便利だなぁ。

以上3Stepで、実際に実装をします。

余談 実は…

 ここからは、OSの内容と全く関係なし。このマガジンについて。
当初はMikan本を読み&写経しながら書いていこうとはじめたのですが、
開発が楽しくてね…..。実は先に全部読破してしまいました。ハイ。
 ということで、ここからは振り返りで書いていきます。

以上お付き合いいただきありがとうございました

この記事が気に入ったらサポートをしてみませんか?