8

PCとOSがどのように相互作用するかについての全体像を完成させようとしています。そして、私は、デバイスドライバーに関しては、ほとんど推測できないところにいます。

複雑すぎるようなことを書かないでください。そうしないと、高度なプログラミング言語やwinapi関数を使用するときに知る必要がありません。知りたいのですが、勉強用です。

つまり、OSとPC(PCはもちろんHWを意味します)の非常に基本的な構造は、CPUがそれ自体で実行できる直接CPUコマンド(算術演算、レジスタアクセス、メモリアクセス)以外のすべてがどのように見えるかということです。 )OSを通過する必要があります。主にリングレベル3から、他のHWをエースするために使用されるイントラクションを使用することはできません。MMIOがあることは知っていますが、最初にポート通信で設定する必要があります。

いつもこんな感じではありませんでした。私はMSDOSを覚えているのは少し若いですが、HWに直接アクセスできることは知っています。なぜなら、制限や呼び出しモードがないからです。したがって、DOS関数を使用して文字列を表示するか、ビデオカードのメモリに直接アクセスして自分で書き込むことができます。

しかし、OSが開発されるにつれて、この可能性はなくなりました。しかし、OSがすべてのHW通信を処理するようになったので、それは問題ありません。率直に言って、マルチタスク環境では、より便利ではるかに安全です(私が唯一のオプションと言えます)。そのため、今日では、BIOSマップ関数またはDOS関数を使用するためにint命令を使用する代わりに、知る必要のないすべてを処理するよりも内部的にdllを呼び出します。

これは分かります。また、デバイスドライバーは、リングレベル0で実行されるコードの一部であるため、すべてのハードウェア操作を実行できることも理解しています。しかし、私が理解していないのは、OSとデバイスドライバー間の接続です。例を見てみましょう-サウンドカードに音を出させたいのです。だから私はサウンドカードにアクセスするためにWindowsAPIを呼び出しますが、それ以上に何が起こりますか?Windowsはデバイスドライバーを呼び出してそうしますか?

しかし、デバイスドライバーを呼び出す場合、winAPI関数で呼び出すことができるすべてのデバイスドライバーには、特定の方法で名前が付けられたルーチンが必要であることを意味しますか?つまり、新しいサウンドカードを使用する場合、そのドライバーには古いサウンドカードと同じ名前の機能が必要ですか?では、Windowsは実際にその観点から同じ関数を呼び出すことができますか?ただし、Windowsにデバイスドライバーによって要求される事前定義された機能のセットがある場合、OSの最後のバージョンがリリースされる前に存在していなかった新しいドライバーを使用することはできません。

この混乱を理解するのを手伝ってください。私は本当に怒っています。ありがとう。

4

2 に答える 2

10

WindowsデバイスドライバーはDLLに少し似ていますが、アプリケーションが動的にリンク/ロードする代わりに、動的にリンク/ロードするのはO/Sである点が異なります。

レジストリエントリは、O / Sにどのデバイスドライバーが存在するかを通知します(これにより、O / Sは動的リンク/ロードするデバイスドライバーを認識します)。

デバイスドライバーはリング0で実行されます。リング0では、それら(デバイスドライバー)はWindows APIにアクセスできません(リンクまたは使用できません)。代わりに、さまざまなNTカーネルAPIにアクセスできます。

しかし、デバイスドライバーを呼び出す場合、winAPI関数で呼び出すことができるすべてのデバイスドライバーには、特定の方法で名前が付けられたルーチンが必要であることを意味しますか?つまり、新しいサウンドカードを使用する場合、そのドライバーには古いサウンドカードと同じ名前の機能が必要ですか?では、Windowsは実際にその観点から同じ関数を呼び出すことができますか?

基本的にはい。特定のタイプまたはクラス内のすべてのデバイスドライバー(たとえば、すべてのビデオドライバー、またはすべてのディスクドライバー)には、O / Sによって呼び出される(および/またはより高いレベルのドライバーによって呼び出される、たとえばディスクドライバーはファイルシステムドライバによって使用/呼び出されます)。

Windows Device Driver Kitは、さまざまなAPIを定義し、さまざまな種類のデバイス用のサンプルドライバーを含んでいます。

ただし、Windowsにデバイスドライバーによって要求される事前定義された機能のセットがある場合、OSの最後のバージョンがリリースされる前に存在していなかった新しいドライバーを使用することはできません。

O / Sはデバイスドライバー機能に動的にリンクしています。デバイスドライバーAPIは事前定義されているため、O/Sに関する限りデバイスドライバーは交換可能です。標準のデバイスドライバーAPIをサポートしている(下位互換性がある)場合は、新しいデバイスドライバーを作成できます。

動的リンクメカニズムは、COMオブジェクトまたはC ++クラスが事前定義された純粋抽象インターフェイスを実装する方法と非常に似ています。DDKのヘッダーファイルは純粋抽象インターフェイス(仮想関数など)を宣言し、デバイスドライバーはこれらの関数を実装します。 O / Sはドライバーをロードし、これらの関数を呼び出します。

于 2010-05-31T19:10:27.557 に答える
1

基本事項: この説明は簡略化されており、すべてではなくほとんどの場合にのみ当てはまる場合があることに注意してください。

これまでに遭遇するほとんどのHWデバイスには、次の基本的な操作があります。メモリ(またはレジスタ)への書き込み。それらのメモリ(またはレジスタ)から読み取ります。

これは、HWを制御し、必要なデータを提供し、HWから必要なデータを取得するのに十分です。

これらのメモリ領域は、BIOSおよび/またはOSによってPCの物理メモリ範囲にマッピングされます(これは、ドライバによってアクセスされる場合があります)。

これで、デバイスドライバーが実行することを知っているREADとWRITEの2つの操作ができました。

さらに、ドライバーはCPUを使用しない方法で読み取りと書き込みを行うことができます。これはダイレクトメモリアクセス(DMA)と呼ばれ、通常はハードウェアによって実行されます。

最後のタイプの操作はINTERRUPTSと呼ばれ、HWがドライバーに発生したばかりのことを通知するためのものです。これは通常、HWがCPUに割り込んで、ドライバーを呼び出して優先度の高い操作を実行することによって行われます。例:画像はHWでドライバーが読み取る準備ができています。

于 2017-10-19T05:39:15.383 に答える