web-dev-qa-db-ja.com

プログラムはどの程度正確にデバイスドライバーと通信しますか?

そのため、プログラマーがコンピューター上のデバイスとどのように対話するのか、私は混乱しています。今、私は大きなアイデアを話していません。さまざまなプログラムがその機能を使用できるように、ハードウェアの上にあるデバイスドライバーがあることを知っています。

しかし、一般的にドライバーと正確に話し合うのは誰ですか?プログラマーは、ドライバーの関数を呼び出す責任があるアプリケーションを作成していますか?または、プログラマーはドライバーへの呼び出しを処理するオペレーティングシステムを介して関数を呼び出しますか?

12
Jason

オペレーティングシステムが関与している場合、プログラムはデバイスドライバーと通信しません。少なくとも直接は通信しません。プログラムは、知らないうちに、最終的には1つ以上の抽象化レイヤーを介してデバイスドライバーと通信する抽象化と対話します。

現代のオペレーティングシステムの複雑さをスキップして、例として45年前に開発されたマイクロコンピューターオペレーティングシステム CP/M を使用します。 CP/Mは3層のレイヤーケーキでした。

Program。最上層はprogramであり、何か有用なことを行います(ワープロ、スペースインベーダーの再生)計算とI/Oを実行する。ある時点で、プログラムがユーザーに「A」の文字を表示したいとします。 CP/Mは、consoleと呼ばれる抽象化を提供します。これは、プログラムと対話するユーザーが見るべき場所です。キャラクターを送信する従来の方法は、いくつかのアセンブリー指示があります:

_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_がすべて約1分でわかります。 。ここでの要点は、プログラムが知っているのは、コンソールがあり、それに書き込む方法があるということだけです。それ以外は何も知りませんし、気にしません。これは、CP/MがI/Oに使用する2つの抽象化のうちの最初のものです。

[〜#〜] bdos [〜#〜]。プログラムが呼び出したアドレス_5_は、次のレイヤー、ベーシックディスクオペレーティングシステムまたは[〜#〜] bdosのエントリポイントです[〜#〜]。 BDOSは 番号付き機能の多くのラフト を提供します。これは、レストランメニューから番号で注文するようなものです。 Cレジスタに関数番号(コンソール出力の場合は_2_)をロードし、送信する文字をEレジスタにロードして、コンソール出力を希望することを伝えます。コンソール出力は非常に単純な操作であり、BDOSは次のレイヤーを呼び出す以外に、実際に操作する必要はありません。

BIOS。BIOS、またはBasic Input/Output Systemは、すべてのハードウェアが特定のコードが生きています。最近のシステムでは、これはデバイスドライバーのセットと見なされます。 BDOSと同様に、BIOSは 非常にプリミティブな操作の標準セットを呼び出します を提供し、BDOSはそのビジネスに使用します。これらの操作の1つはCONOUTと呼ばれ、プログラムが要求した文字を2つ上のレイヤーに書き込むように処理し、ハードウェアが実行するすべてのハードウェアを処理します。 (PCとは異なり、当時は均一ではありませんでした。誰のシステムでも、それを実現するためのさまざまな方法がありました。)コンソール出力はBDOSの単純なパススルーですが、ディスク上にファイルを作成するなど、より複雑なことを行うと、メディアを操作するためのBIOS呼び出し。繰り返しますが、BIOSには標準の抽象的なインターフェイスがあるため、BDOSは必要なものを取得する方法を常に認識しており、BIOSがどのように実行するかを気にしません。

なぜ1つだけではなく、なぜ2つの抽象化(プログラムからBDOSへ、およびBDOSからBIOSへ)があるのか​​疑問に思われるでしょう。答えは、CP/MとそのBDOSがバイナリ形式でコンピューターメーカーに提供される可能性があるということです。ハードウェア用のデバイスドライバーを使用してカスタムBIOSを作成し、2つを結合してシステムのOSとして出荷します。 BDOSは1つの組織によって管理されていて、常にユーザープログラムにとって既知の量であり、非常に幅広い(当時の)さまざまなハードウェアで同じアプリケーションを実行できるため、これは大きな問題でした。これがオペレーティングシステムが存在する理由であり、 ハードウェアを直接いじるプログラムを書く だけではありません。

ここで説明したことはすべて、最新のオペレーティングシステムにも当てはまります。たとえば、Unixはすべてをファイルとして抽象化します。これは、プログラムに同じシステムコールのセット(open()write()close()など)を提供し、ディスクドライブかシリアルポートかを通信します。決定と抽象化のセットははるかに複雑ですが、最終的には、最終的には、操作を実行するために実行する必要がある最下層のデバイスドライバーコードを選択することになります。

12
Blrfl

さまざまな可能性がたくさんあります。

  • 一般的に使用されるデバイスの場合、OSにはドライバーが実装し、言語の標準ライブラリーが適応するAPIが含まれていることがよくあります。典型的な例:ファイルシステム、プリンター、ネットワーク、MIDI楽器。
  • よりエキゾチックなデバイスの場合、デバイスの製造元はドライバーを提供する必要があり、ドライバーには一般的な言語の言語バインディングも含まれる場合があります。少なくともCバインディングがあり、ほとんどすべての言語でCライブラリを呼び出す方法がいくつかあります。
  • これらの2つのケースの中間にある単純なデバイスは、シリアルポートのような汎用接続を使用するだけで、製造元は、一般的なシリアルポートドライバーを介して使用できるプロトコルのみを公開します。
0