プログラマーがコンピューター上のデバイスとどのように話しているのか、私は混乱しています。今、私は大きなアイデアを話していません。さまざまなプログラムがその機能を使用できるように、ハードウェアの上にあるデバイスドライバーがあることを知っています。
しかし、一般的に誰がドライバーと正確に話しますか?アプリケーションの作成者は、ドライバーの関数を呼び出す責任がありますか?または、プログラマーは、ドライバーへの呼び出しを処理するオペレーティングシステムを介して関数を呼び出しますか?
プログラマーがコンピューター上のデバイスとどのように話しているのか、私は混乱しています。今、私は大きなアイデアを話していません。さまざまなプログラムがその機能を使用できるように、ハードウェアの上にあるデバイスドライバーがあることを知っています。
しかし、一般的に誰がドライバーと正確に話しますか?アプリケーションの作成者は、ドライバーの関数を呼び出す責任がありますか?または、プログラマーは、ドライバーへの呼び出しを処理するオペレーティングシステムを介して関数を呼び出しますか?
回答:
関連するオペレーティングシステムがある場合、プログラムは少なくとも直接ではなく、デバイスドライバーと通信しません。プログラムは、知らないうちに、最終的には1つ以上の抽象化レイヤーを介してデバイスドライバーと対話する抽象化と対話します。
現代のオペレーティングシステムの複雑さをスキップし、45年前に開発されたマイクロコンピューターオペレーティングシステムであるCP / Mを例として使用します。CP / Mは3つの層を持つ層ケーキでした。
プログラム。 最上層は、計算とI / Oを実行することにより、有用な処理(ワードプロセッシング、スペースインベーダーのプレイ)を行うプログラムです。ある時点で、ユーザーが見られるようにプログラムが文字「A」を表示したいとします。CP / Mは、コンソールと呼ばれる抽象化を提供します。これは、プログラムと対話するユーザーが見るべき場所です。キャラクターを送信する従来の方法には、いくつかのアセンブリ命令があります:
LD C,2 ; Load 2 into register C
LD E,65 ; Load the ASCII code for 'A' into register E
CALL 5 ; Call CP/M's routine for getting things done
(あなたがそれらに慣れていない場合は、レジスタは、プロセッサに住んで変数として考えることができます。)私たちは、どのようなマジックナンバーを取得します2
し、5
分にはすべてについてです。ここでのポイントは、プログラムが知っているのはコンソールがあり、それに書き込む方法があるということだけです。それ以上のことは知りませんし、気にしません。これは、CP / MがI / Oに使用する2つの抽象化の最初のものです。
BDOS。5
プログラムが呼び出したアドレスは、次のレイヤー、ベーシックディスクオペレーティングシステムまたはBDOSのエントリポイントです。BDOSは、レストランのメニューから番号順に注文するような、多数の番号付き機能を提供します。C
レジスタに関数番号(2
コンソール出力用)をロードし、レジスタE
に送信する文字をロードすることにより、コンソール出力が必要であることを伝えます。コンソール出力は非常に簡単な操作であり、BDOSは次のレイヤーを呼び出すこと以外は実際にそれを行う必要はありません。
BIOS。 BIOS、または基本入出力システムは、ハードウェア固有のコードがすべて存在する層です。最新のシステムでは、これはデバイスドライバーのセットと見なされます。BDOSと同様に、BIOSは、BDOSがビジネスを行うために使用する非常に基本的な操作の標準セットの呼び出しを提供します。それらの操作の1つが呼び出されますCONOUT
、プログラムが要求するキャラクターを取得し、ハードウェアが何であれ、上記の2つのレイヤーを書き込むようにします。(PCとは異なり、物事は当時は均一ではありませんでした。誰のシステムでもそれを実現するためのさまざまな方法がありました。) BIOSがメディアを操作するために呼び出します。繰り返しになりますが、BIOSには標準の抽象的なインターフェイスがあるため、BDOSは常に必要なものを取得する方法を知っており、BIOSがそれを行う方法を気にしません。
なぜ、1つだけではなく2つの抽象化(プログラムからBDOSとBDOSからBIOS)があるのか疑問に思われるでしょう。答えは、CP / MとそのBDOSをコンピューターメーカーにバイナリ形式で提供し、ハードウェア用のデバイスドライバーを使用してカスタムBIOSを作成し、2つをまとめてシステムのOSとして出荷することです。これは、BDOSが1つの組織によって維持され、したがってユーザープログラムにとって常に既知の量であり、非常に幅広い(当面)さまざまなハードウェアで同じアプリケーションを実行できるため、大したことでした。これがオペレーティングシステムが存在する理由であり、私たちは直接ハードウェアをいじるプログラムを書くだけではありません。
ここで説明したことはすべて、最新のオペレーティングシステムにも適用されます。たとえば、Unixはすべてをファイルとして抽象化します。これは、プログラムにシステムコールの同じセット(与えopen()
、write()
、close()
それはディスク・ドライブまたはシリアルポートのかどうか通信する、など)。一連の決定と抽象化ははるかに複雑ですが、最終的には、操作を実行するために最下層で実行する必要があるデバイスドライバーコードを選択することになります。
call 5
。rst 8
もっと効果的ではなかったでしょう(宛先アドレスで3バイトのメモリを犠牲にしますが、呼び出されるたびに2バイトを節約します...)?
RST
データバスに1バイトの命令(通常はa )を置く割り込みモードが1つしかありませんでした。確かに言うことはできませんが、すべてのデバイスとDDT(ブレークポイントを発生させるためにそれらを使用)のニーズに対応するのに十分なスロットがありませんでした。 。
さまざまな可能性があります。