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


12

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

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



1
両方とも少しですが、OSやデバイスの種類によって異なります。
-whatsisname

回答:


12

関連するオペレーティングシステムがある場合、プログラムは少なくとも直接ではなく、デバイスドライバーと通信しません。プログラムは、知らないうちに、最終的には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つの抽象化の最初のものです。

BDOS5プログラムが呼び出したアドレスは、次のレイヤー、ベーシックディスクオペレーティングシステムまたは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()それはディスク・ドライブまたはシリアルポートのかどうか通信する、など)。一連の決定と抽象化ははるかに複雑ですが、最終的には、操作を実行するために最下層で実行する必要があるデバイスドライバーコードを選択することになります。


これまでCP / Mコードを実際に見たことはありません(少し前のことです... CP / Mコンピューターを使用したことがありますが、コードを書いたことはありません)call 5rst 8もっと効果的ではなかったでしょう(宛先アドレスで3バイトのメモリを犠牲にしますが、呼び出されるたびに2バイトを節約します...)?
ジュール

@Jules:CP / Mは8080用に開発されたもので、割り込みデバイスがRSTデータバスに1バイトの命令(通常はa )を置く割り込みモードが1つしかありませんでした。確かに言うことはできませんが、すべてのデバイスとDDT(ブレークポイントを発生させるためにそれらを使用)のニーズに対応するのに十分なスロットがありませんでした。 。
Blrfl

あ。はい、それは理にかなっています。私の8ビット開発経験は、割り込みソースが1つしかないマシンに限られているため、そのようなことをそれほど心配する必要はありませんでした... :)
Jules

簡単な質問、このプロセスはどのようにWindows OSとWindowsカーネルに関連していますか?または、そのために新しい質問をする必要があります。
ジェイソン

@Jason:ウィキペディアには、アーキテクチャを説明し、答えを提供するページがあります。1993年以降にMicrosoftが作成したものはすべて、このアーキテクチャを使用しています。ケーキの層が増えるだけで、ほぼ同じです。
Blrfl

0

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

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