2ntブログ

Windows I/OポートとIRQ(割り込み)

コンピュータの心臓部であり、プログラウに書かれた命令を実行するのはCPUである。

このCPUが直接操作できるのは、「物理メモリ」と呼ばれる、マザーボードに刺さってる4GBとか16GBとかの搭載メモリなどと言われる「デバイス」だけである。

音源チップ・グラフィックのチップ、キーボードやマウスに至るまで、すべてCPUは「直接」操作できない。
ではどうやって、これら「物理メモリ」以外の「デバイス」とデータのやり取りや命令を送ったりをしているのか?

これを「I/Oポート」を使って行うのだ。
「I/Oポート」というのは、直訳すると「入出力窓口」みたいな感じだろうか。

「物理メモリ」以外のデバイスというのは、いわば社外の別会社みたいなものだ。
「物理メモリ」は社内の他部署みたいなもので、同じ建物内に居るので、窓口なんぞ不要で直に会って資料を渡す事もできるし、話もできる。
しかしそれ以外の「デバイス」というのは、基本的に別の場所にある別の建物内の別会社なので、「I/Oポート」という窓口経由でしか、荷物の受け渡しもできないし、話もできないのだ。

「I/Oポート」にも、メモリのように「番地」が付けられた複数の経路がある。
「I/Oポート」ひとつでやり取りできるデータというのは、1バイトである。
マウスやキーボードのように、やり取りするデータがごく少量であったり、小さい値である場合は良いが、音源チップやグラフィックのチップのように、大量の大きな数値のデータをやり取りする場合、窓口がひとつで1バイトづつやり取りしてたら、とてもじゃないが処理が遅くて使えない。
なので大量の大きなデータをやり取りしなければならないデバイスは、たいていは複数の「I/Oポート」を使っている。
デバイスマネージャで、デバイスのプロパティにある「リソース」タブを見た時に、「I/Oポート」は「〇〇~△△」みたいに、範囲で表示されているのがあるのは、そのためだ。

しかし実際はこれでも音源やグラフィックチップなどのように、ものすごい大量のデータを素早くやり取りする必要のあるデバイスでは、処理が間に合わないのだ。
だから音源やグラフィックチップは、PCに搭載されている「物理メモリ」とは別に、独自の「内蔵メモリ」というものを持っている。
ビデオカードなんかには、型番名や性能に「〇GB」というカードに搭載しているメモリが書いてあるのからも、分かると思う。

さてこの内蔵メモリはどう使われるのか?

音源やビデオカードは、PCIeという規格でマザーボード(基盤)と接続されている。
これは、古いデバイスとの接続規格のである「I/Oポート」よりも、太く高速な線で繋がれるのだ。
細い1車線の道路を、複数用意して繋ぐのではなく、10車線ぐらいの太くて広い道路でCPUと繋がれるような感じだ。

なので今のPCは、「I/Oポート」経由で、音声やグラフィックデータのやり取りはしない。
すべてこれらのデバイスが内蔵しているメモリを、さも物理メモリであるかのように扱って、直接データのやり取りが行えるようにしている。
これが、一部のデバイスのリソース欄にある「メモリ」という値だ。
メモリ範囲

私のPCは物理メモリは4GBしか積んでない。
なので4GBより上のメモリを指す「アドレス」は、本来であれば使われない。
この使われていない、存在しない物理メモリアドレスを、ビデオカードの内蔵メモリのアドレスとして割り当てるのだ。
こうすることで、CPUは「I/Oポート」を通さずに、物理メモリと同じように直接データを書き込んだり読み取ったりできるようになる。

上の写真の例で言えば、メモリアドレスの「FA000000~FAFFFFFF」番地というのは、4GBの物理メモリでは使われてない、存在しないはずのアドレスである。
そこへビデオカード内蔵メモリを割り当てていますという意味なのだ。

マシン語レベルの話になるが、「I/Oポート」に何かのデータを送る、あるいは読み取る命令よりも、メモリにデータを送ったり読み込んだりする命令の方が、処理に掛かる時間は短いというのもある。

高解像度・フルカラーで、しかも3D動画みたいなのが主流になった現在では、これでも処理が間に合わない事が増えた。
なのでビデオカード側には、今まではCPUが行ってきた3Dのグラフィックデータの計算や、動画データの処理を、グラフィックチップがCPUに代わって行う機能がある。
つまりCPUが行っていた仕事の一部を、別の会社に業務委託するような感じになっている。

グラフィックデータの元みたいなのだけ、ビデオカードのメモリに送って、「I/Oポート」経由で「このデータを〇〇しといて」みたいな命令をグラフィックチップに送る。
今のPCは、こうすることで過去のWindowsではファミコン並みの小さな解像度の動画ですら、スムーズに再生するのがやっとだったのを、高解像度のHDで再生する事が可能になっているのだ。
フル3Dのゲームが動かせるようになっているのだ。

ちなみに、単純にデジタルデータの形になっている音声データを、スピーカーなどで人間の耳に聞こえる形にするため、電圧の変化をつけた電流であるアナログ信号に変える仕事しかしてない音源チップには、「I/Oポート」は無い。
命令を送る必要が無いからだ。
「HD AUDIO」は、リソースとしては「メモリ」と「IRQ(割り込み)」しか使ってない。

「I/Oポート」と「メモリ」というリソース欄の値の意味は、だいたいこんなところだが、もうひとつある「IRQ(割り込み)」とは何だろうか?

例えば、マウスを動かした、キーボードでどんな文字の入力がされたかは、マウス・キーボードという「デバイス」側からCPUへ「I/Oポート」を通して伝えられる。
しかしCPUがその時に、そのデータを受け取れる体制にあるとは限らない。
何か別のプログラム処理を実行中であれば、せっかくキーボードから送られてきた入力データは「破棄」されてしまう。
そうなると、例えば「あいうえお」という文章を打ち込んでも、「い えお」みたいなCPUが暇な時に受け取れたものだけしか表示されなくなってしまう。
これでは困る。
そこで登場するのが「IRQ」だ。
「IRQ」は「I/Oポート」や「メモリ」のように、データをやり取りするためのリソースではない。
CPUへの緊急呼び出しみたいなものだ。
CPUは「割り込み信号」を受信すると、即座にいま実行中のプログラム処理を一時停止して、その信号を送ってきたデバイスの処理を行う仕組みになっている。
これによって、マウスやキーボードなどの入力をリアルタイムで取りこぼしなく受け取って処理できるようになるのだ。
またCPU側にもメリットがあって、何か入力があればマウスやキーボードの方から呼び出して知らせてくれるので、いちいちプログラムにマウスやキーボードの入力を読みに行く処理を入れなくて済むというのもある。
その分、他のもっと重要な計算処理に専念できるので、相対的にPCの処理スピード全体がアップするのだ。

「IRQ」というのは、いわば玄関についてるチャイムのようなものなのだ。
自宅に居る時に、10分置きとかで、玄関に来客がないかどうか確認しに行く人なんて居ない。
なぜなら、来客があればチャイムが鳴るからだ。
チャイムが「ピンポーン」と鳴って、はじめて「はーい」と返事してドアを開けたりインターホンに出て会話したりする。
このドアやインターホンが「I/Oポート」なのだ。
まぁドアの方は、「I/Oポート」というより「メモリ」の方が近いかもしれない。
なぜならインターホン越しでは、会話はできるが荷物は受け取れないからだ。

これが「デバイス」の「リソース」欄にある「I/Oポート範囲」「IRQ」「メモリ範囲」というものの正体ですという話。

コメントの投稿

非公開コメント

カウンタ
プロフィール

ウホッ!いい男

Author:ウホッ!いい男
異世界転生を待ち続ける中高年のおっさん

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR