B.3. コンピュータ内部の仕組み、さまざまな層の関係性
コンピュータはどちらかと言えば抽象的なものとして考えられる場合が多く、外から見えるインターフェースは内部の複雑さに比べてずっと簡単なものです。この複雑さの原因は関連する要素が多いことです。しかしながら、これらの要素は層状構造とみなすことが可能で、ある層が影響をおよぼしたり影響を受けたりするのはその層の真上と真下の層に限られています。
すべてがうまく動作している限り、エンドユーザは各層の詳細を理解する必要はありません。「インターネットにつながらない!」などの問題に直面した場合、真っ先にやるべきは、問題の原因になっている層を特定することです。ネットワークカード (ハードウェア) は動いていますか? コンピュータはネットワークカードを認識していますか? Linux カーネルはネットワークカードを認識していますか? ネットワークパラメータは適切に設定されていますか? これらの質問により、コンピュータは適切な層に分割され、問題の本質的な原因になっている層を特定することが可能です。
Let us start with a basic reminder that a computer is, first and foremost, a set of hardware elements. There is generally a main board (known as the motherboard), with one (or more) processor(s), some RAM, device controllers, and extension slots for option boards (for other device controllers). Most noteworthy among these controllers are IDE (Parallel ATA), SCSI and Serial ATA, for connecting to storage devices such as hard disks. Other controllers include USB, which is able to host a great variety of devices (ranging from webcams to thermometers, from keyboards to home automation systems) and IEEE 1394 (Firewire). These controllers often allow connecting several devices so the complete subsystem handled by a controller is therefore usually known as a “bus”. Option boards include graphics cards (into which monitor screens will be plugged), sound cards, network interface cards, and so on. Some main boards are pre-built with these features, and don't need option boards.
ハードウェアはひとりでに動くものではありません。ハードウェアを制御するソフトウェアがなければ、ハードウェアをまともに動作させることはできません。オペレーティングシステムとアプリケーションはハードウェアを制御したりハードウェアと情報をやり取りする機能を提供します。そしてこれを行うためにはハードウェアを正常に機能させる必要があります。
ハードウェアとソフトウェアの共生関係はひとりでに発生するものではありません。コンピュータ起動時には、いくつかの初期設定が必要です。この初期設定を担当しているのが BIOS および UEFI です。BIOS と UEFI はマザーボードに組み込まれた小さなソフトウェアで、起動中に自動的に実行されます。BIOS と UEFI の最も重要な役割に、ハードウェアの制御を引き継ぐソフトウェアを検索する役割があります。BIOS の場合、通常これはブートセクタ (
マスターブートレコードや
MBR として知られています) を備えた最初のハードディスクを検索し、ブートセクタを読み込んで、ブートセクタに収められているソフトウェアを実行することに相当します。BIOS の関与する動作はここまでです (次回起動時まで関与しません)。UEFI の場合、後に起動する EFI アプリケーションが収められている専用の EFI パーティションを見つけるためにディスクを走査します。
ブートセクタ (または EFI パーティション) には別のソフトウェアが保存されています。これはブートローダと呼ばれ、オペレーティングシステムを探して実行するためのものです。ブートローダはマザーボードに組み込まれているのではなく、ディスクから読み込まれます。このため、BIOS よりも多くの機能を持っています。BIOS 自身がオペレーティングシステムを読み込まないのはこれが理由です。たとえば、ブートローダ (Linux システムでは GRUB を使うことが多いです) は利用できるオペレーティングシステムを表示し、ユーザに起動するオペレーティングシステムを尋ねることが可能です。通常、タイムアウトとデフォルトの回答が設定されています。ここでユーザはカーネルに渡すパラメータを追加したりすることも可能です。最終的に、カーネルが見つかり、メモリに読み込まれ、実行されます。
また、BIOS/UEFI は多数のデバイスを検出して初期化します。言うまでもなくこのデバイスには、IDE/SATA デバイス (通常ハードディスクおよび CD/DVD-ROM デバイス) だけでなく PCI デバイスも含まれます。検出されたデバイスは起動処理中に画面に表示されます。デバイスリストがすぐに消えてしまう場合、Pause キーを押せば表示を中止して内容を読むことが可能です。インストールされた PCI デバイスがリストに含まれないのは悪い兆しです。最悪の場合、デバイスは欠陥品ということになります。良くても、デバイスは BIOS またはマザーボードの現在のバージョンと互換性がないということになります。PCI 仕様は進化しており、古いマザーボードで新しい PCI デバイスを使える保証はありません。
BIOS/UEFI とブートローダはそれぞれ数秒間だけ実行されます。これでついに、長時間実行するソフトウェアであるオペレーティングシステムカーネルに到達します。カーネルはオーケストラで言えば指揮者の役割を果たし、ハードウェアとソフトウェア間の調整を行います。カーネルは複数の仕事を担当しています。具体的に言えば、ハードウェアの駆動、プロセスの管理、ユーザとパーミッションの管理、ファイルシステムの管理などを担当しています。カーネルはシステム上のすべての他のプログラムに共通基盤を提供するものです。
カーネル以外のすべては「ユーザ空間」の意味でひとくくりにされますが、「ユーザ空間」をさらにいくつかのソフトウェア層に分割することが可能です。しかしながら、ソフトウェア層同士の相互作用は以前に比べてさらに複雑化しており、ソフトウェア層の分類分けは単純ではありません。アプリケーションは一般にライブラリを使います。ライブラリはカーネルと通信しますが、通信には他のプログラムまたはさらに多くのライブラリが必要です。