コンピュータを動かしているものとはなにか?
おはようございます。またはこんにちは。もしくはこんばんわ。マゲっちSCと申します。2月も中旬となりました。2022年2月4日より中国北京にて冬季オリンピックが開催されていますね。日本選手団の皆さんにはぜひとも悔いのないように楽しんでいただけたらと思います。そして立春を迎えたとは言えこの時期が一年で一番冷える気がしますね。皆さんもお風邪など召さぬようお気をつけください。
さて、前回のブログですがBIOSについてお話させていただきました。コンピュータの電源を入れるとまずBIOSが起動します。その後POSTが走りハードウェアに故障がないかどうかを確認した上でブートデバイス(起動するOSが入っているストレージ)にアクセスしてブートストラップ(OS起動用のプログラムのようなもの)をCPUへ転送します。CPUがOSのデータを計算してメモリに展開して行き、手続きがすべて終了するとPCが起動します。最近はSSDが搭載されているPCが多いので起動までかかる時間は一瞬ですが、あの短い時間の中で相当量の計算が行われています。本来はユーザ側でコマンドをキーボードから入力して1つ1つのデバイスをPC上で認識させていかないといけないのですが、そんなことを毎回していると時間も手間もかかってしまいます。OSは非常にありがたいものですね。
OSのおさらい
OSについては過去にいくつかブログでお話させていただきました。ですのですでに頭に入っている方もいらっしゃると思いますが、一応ここで簡単にOSについておさらいしておきましょう。そしてOSのおさらいの前にもう一度確認をしておきます。PCは電子計算機であり電子部品に電気エネルギーを流すことで各部品が動き出します。ストレージからOSやその他の応用ソフトウェア、作成されたデータを読み込みCPUが計算してメモリ上にデータを展開・記憶します。もしなにかデータが更新されたらメモリ上のデータに上書きして記憶します。入力装置からなにか入力されたらそれもCPUが計算してメモリ上に記憶していきます。例えば私が書いているブログも、キーボードから文字を入力していき文字記号をCPUが計算します。その後メモリ上にあるブログのデータにアクセスして状態をどんどん上書きしていきます。そうすることで文字記号が文字列になり文章となっていきます。うまく上書きされていない場合は永遠に私のブログは書き上がることはありません。また、入力装置から保存命令が来た場合は所定の記憶装置や記憶媒体へデータをファイルとして記録します。例えばUSBメモリに作った文書ファイルを保存するなどができます。
これらのことは当たり前のことであり一見すると何の疑問も感じないかも知れません。PCなんだからそのくらいできて当たり前と言われればたしかにそのとおりであり反論の余地もありません。しかし皆さん、なぜキーボードやマウスなどの入力装置でPCに命令を出すとPCが応えるのか不思議ではありませんか?今回はその謎に迫る内容です。難しい内容なのですべてを覚える必要はありません。だいたいでかまいませんのでPC内部ではこういう事が起きているのかという発見につながれば幸いです。
コンピュータはハードウェアをどう認識しているのか?
では1つずつ謎に迫っていきましょう。順番としてはハードウェア側からソフトウェア側に移動していきます。入力はすべてハードウェア、つまり手で触れる機器を使うからです。
電源を入れてPCが起動するところまでは前述しましたが、電源を投入した直後はPCに何がつながっているのかを把握できるのはBIOSだけです。最近のBIOS(UEFI)ではUSBで接続されている機器まである程度であれば認識することができるようになっています。また、CPUやメモリはもちろんグラフィックボードもきちんと確認することができます。データを入出力する必要最低限のものはBIOS起動時点でBIOS側がすでに認識しているため、BIOS画面をモニターに表示したりキーボードやマウスを使用できたり、USBメモリ内にあるデータにもアクセスすることができます。
POSTが通って特に故障がないと判断した場合BIOSは設定された内容に従って各ハードウェアを制御します。そして、OSのデータがあるとされるストレージへ順番にアクセスしていきます。OSのデータが見つかればそこでOSを起動させてPCを起動させます。BIOSのほとんどの仕事はここで終了です。
PCが起動している間にOSはつながっているハードウェアの情報と現在の年月日と時刻をBIOSから受け渡してもらいます。CPUやメモリ、ストレージの情報を受け取りストレージや光学ドライブに関してはマウントという作業を行います。本来コンピュータでは手動でどのストレージを使用するのかを選ぶことができるのですが、その作業をPCでやることになるとユーザへの敷居が高くなってしまいます。そこでOS起動時にマザーボードに直結しているストレージや光学ドライブに関しては自動でマウント処理が行われています。マウントされたストレージは初めてそこでOS上からアクセスが可能になります。
OSが立ち上がった直後ですが、まずOSは自分に対してどのような周辺機器が接続されているのかを把握する必要があります。入力機器はもちろんですが出力機器も認識していなければなりません。まずUSBを通じて各デバイスの情報を集めます。キーボードやマウス、ゲームパッドやUSB接続のスピーカーなどですね。またPCIeに接続されている機器の情報も取得します。そしてストレージ内にインストールされているデバイスドライバと合致するものを順番に巡回していき、合致したものを自分に接続された周辺機器として認識します。こうしてモニターからキーボードやマウス、ゲームパッド、USBメモリや外付けのHDDに外付け光学ドライブなどを認識します。OSはデバイスドライバを介して自分に接続されているハードウェアを正確に認識して、それらもきちんと制御できるようになります。
コンピュータはユーザからの命令をどう受け付けているのか?
さて、これでコンピュータは使用できる準備が完全に整いました。しかし例えばマウスカーソルを移動させたり、マウスのボタンをクリックしたとき、どうやって命令を受け付けて、その命令のとおりに動作させているのでしょうか?マウスカーソルを左に移動させるとマウスを動かしたとおり画面内のマウスカーソルも移動します。移動を止めるとマウスカーソルも移動しなくなります。これはどういうことなのでしょうか?まずマウスを動かすとマウスのデバイスドライバからOSに対して「マウスカーソルが左に◯ミッキー移動しました」と伝わります。マウスを移動させる際の距離の単位をミッキーといい、1ミッキーは約0.25mmです。
OSはCPUに命令してマウスカーソルを現在の座標から◯ミッキー分新しい座標へ移動させながらその位置をメモリへ上書きして記憶します。それをユーザがマウスを動かしている間ずっと計算し続けます。そのためユーザ側から見ると画面上をマウスカーソルが随時移動して見えるわけですね。そして所定の位置へマウスカーソルが移動しました。すると今度はユーザから新たな命令が飛んできます。マウスがクリックされました。例えばそれがスタートボタンの上でクリックされたのであればOSがCPUに命令してスタートボタン内のメニューを開きます。これらの命令をどうやってOSが受け取っているのか?ということですが、これが先ほどお話したデバイスドライバの仕事の1つです。各ハードウェアを認識するのはもちろんですが、入力装置からどんな命令が伝わったのかをOSに連絡するわけです。
デバイスドライバから伝わった命令をCPUへ渡す必要がありますが、この時点でマウスがクリックされたとか◯ミッキー分移動したことを把握しているのはOSだけです。OS側からCPUへの連絡ができないと画面にあるマウスカーソルはクリックしても無反応ですし移動すらしません。OSからCPUへ連絡する連絡係が必要です。その連絡係のことを「カーネル」と呼びます。皆さんがよく知っている白いスーツと白ひげのおじさんではありません。カーネルがCPUへマウスのデバイスドライバから来た情報を正確に受け渡してくれるため、画面上ではマウスカーソルが◯ミッキー分きちんと移動したり、ボタンを押すとクリックされた状態になったりするということです。
コンピュータの画面表示は動行っているのか?
では実際のコンピュータの画面を見てみます。コンピュータの画面はデスクトップ画面があり、だいたいその下部にタスクバーが表示されています。デスクトップ画面上にはソフトへのショートカットを含めたアイコンがいくつか表示されていると思います。タスクバーの一番左側にはスタートボタンがあります(Windows10の場合)。ソフトを立ち上げると画面上部にはタイトルバーがあり、メニューバーやアドレスバーなどが表示されます(ソフトによって表示されるものが違ってきますが)。またソフトの画面上部の右側には最小化・最大化・閉じるボタンが並んで表示されています。
これらの表示デザインはWindows10で動作するソフトであれば一部のソフトを除いて共通した仕様となっています。そしてこの共通した画面表示の使用を策定しているのはOSです。WindowsとMacOSは別のOSなのでこの画面表示のデザインが微妙に違うわけです。そしてどのソフトでも例えば閉じるボタンをクリックすればソフトが終了します。このようにソフトごとに共通しているものを「API」と呼びます。プログラマーがAPIを使用してソフトを作ることでOS側で画面の仕様をどのメーカーのどのソフトでも共通のものにすることができるため、Windows10対応のソフトであればどんな目的のどんなメーカーのソフトであっても、ユーザがどれかのソフト1つが使えれば最小化したりソフトを終了させる場合にも、同じように操作できます。またプログラマーもすでにOS側で用意されている仕様やボタンなどをそのまま利用できるため、クリエイター側にとってもメリットがあります。
画面にわかりやすく表示できるのはなぜか?
コンピュータはこうして、実に様々な機能や画面表示の方法などをユーザやクリエイターに対して用意していますが、基本的にコンピュータは電子計算機であり計算する内容は2進数です。もともとコンピュータは豆電球のオン・オフで情報を持っているのかいないのかを判断するものでした。その原理は今も特に変わっておらず、実にたくさんの数え切れない豆電球が常時オン・オフされている状態なのです。つまり画面に表示されるものは本来であれば2進数(マシン語)になるはずです。しかし実際のモニターには人が読める文字や絵などが表示されています。それはなぜなのか?ということですが、カーネルがCPUに渡してメモリに記憶した内容をユーザ側にわかりやすい形式で表示できなければ、いくら効率よく作業をこなせても意味がありません。カーネルの内容を翻訳して画面に出す。またはユーザからの命令を受け付けるユーザ側に対してわかりやすい表示を行う機能を「シェル」といいます。
例えば文書ファイルをワープロソフトで作成していた場合に、途中経過を内臓のHDDに保存しようとしたとします。Windows10の場合はファイルメニュー内にある名前を付けて保存を選択すると保存用のダイアログボックスが表示されます。そこから保存する場所を内蔵HDDに設定し、ファイル名にファイルに付けたい名前を入力して保存ボタンをクリックすると、内蔵HDD内につけたいファイル名で文書ファイルを保存することができます。一見当たり前のように思えますが、これはAPIを使ってデザインされた画面内でユーザが行った作業をシェルが翻訳してカーネルに、「ユーザが内蔵HDDに◯◯というファイル名で文書ファイルを保存する」という内容を翻訳して連絡しています。あとはカーネルがCPUに命令し、結果として内蔵HDDに◯◯という名前の文書ファイルが保存されるわけです。
まとめ
このようにOS上ではデバイスドライバ、カーネル、API、シェルが連携することで実にさまざまなソフトを様々な入力機器を使って操作することができるのです。デバイスドライバが入力機器の認識とOS上での制御の手助けを行い、カーネルがそれらの補助を得ながらCPUやメモリを操作して計算・記憶させ、結果をシェルが翻訳してAPIを通じて画面へ人間にわかりやすい形式で表示します。どうでしょうか?今までなぜこれをするとこうなるのか?という疑問点があったかも知れませんが、少しだけでも解決したのであれば幸いです。難しい内容ですので一気に覚える必要はありません。だいたいで大丈夫です。では次回のブログですが、特に内容は決めません。ブログらしくただ思いついたことを気ままに書いてみようかと思います。ただ、コンピュータの内容にはなるとは思います。ご興味がありましたらまたお立ち寄りください。それでは失礼いたします。