私があなたがこれによって正確に意味することを理解したなら; 私の推測では、あなたはドライバーについての重要なポイントを見逃していると思います。
これはかなり単純化されており、文字通りに解釈されるべきではありません。ドライバーの役割を理解するのに役立つ方法として使用してください。ドライバー
とは正確には何ですか。
これらは、カーネルが便利な方法で特定のデバイスの読み取り、書き込み、および一般的な対話を可能にするコードです。
あなたはそれを捨てることができます。IRQチェックとメモリアドレス(および、フレームのトリミング、バッファリング、データの健全性のチェック、NICまたは他のデバイスでのタスクなどを実行するための非常にハードウェアに依存するルーチンの使用などの多くの追加)を使用して、これを毎回実行しますが、これはデバイスを使用するたびに数百/数千行のコードを記述する必要があり、別のマシンで実行するとコードが機能しなくなるため、意味がありません。
つまり、特定のデバイス用にそのようなコードを記述し、カーネルがそれを使用できるように(ほとんどの場合、Linuxではカーネルモジュールを使用して)ロードします。
このコードは何をしますか?
特定のデバイスタイプのカーネルへの標準インターフェイスを提供するだけです。カーネル(およびユーザースペースプログラム)が特定のデバイスタイプと対話するときにいつでも呼び出すことができる関数のリストを提供します(現在、実装/ドライバー全体は、異なるモデル/ベンダーの同じデバイス間で変更される可能性がありますが、あなたにはインターフェイスは同じままです)
とにかく、なぜあなたはいつもドライバーが必要なのですか?
繰り返しになりますが、デバイスドライバーは、特定のハードウェアを便利な方法で処理する方法です。ハードウェアにドライバーが含まれていると仮定して、ハードウェア内の残りの(ドライバー)と効果的に通信する前に、カーネル内のデバイスを処理するためのコードが必要になります。
例を挙げましょう。私が扱ったすべてのNICは、物理レベルではフレーミングを提供しますが、DataLinkレベルでは提供しないため、NICはイーサネットフレームのプリアンブルとFCSを追加しますが、それでも書き込みを行う必要があります。 MACは、上位層に適切なバッファリングを設定し、独自のドライバコードで自分自身の健全性を確認し、パケットが上に移動するように割り当てます(とりわけ)。
したがって、ベンダーがハードウェア自体にいくつかの機能を提供している場合でも、カーネルがこのデバイスを効果的に使用できるようにインターフェイスを実装する必要があるため、ドライバー全体を提供することはできません。