あなたの質問に対する答えは次のとおりです。(1) そうではありません。(2) いいえ。
ファイル記述子はユーザー空間の概念であり、カーネル ドライバーはユーザー空間の概念と対話しません。(はい、それらはカーネルによって実装されていますが、他のデバイス ドライバーはそれらを直接操作することはできず、間接的に操作することもできません。)
カーネルがアクセス可能なメモリ空間にバッファリングされたデータを受信し、それをハードウェアに送信してから、ハードウェアからデータを受信し、(要求された場合) カーネルがアクセス可能なメモリのバッファに書き込むメソッドを実装します。 .
これを行うには、キャラクター デバイス ドライバー API と PCI デバイス ドライバー API を実装し、ドライバーを PCI デバイスとして登録し、次にキャラクター デバイスとして登録します。これらのメソッドの一部はファイル構造を参照する場合がありますが、それらはあなたがよく知っているユーザーランド構造ではありません。
イーサネット プロトコルを実装するデバイスの場合、代わりに Net Device Interface を実装するため、作業が楽になります。このように、ハードウェアとの間でデータを取得するために必要な部分を記述するだけです。
必要なのは、デバイス ハードウェアの仕様、PCI レジスタと領域を使用してハードウェアを制御する方法です。
幸いなことに、これを一人で行う必要はありません。カーネル開発者の大規模なコミュニティと、Linux カーネルの開発に関する優れた (そして最新の) 本がいくつかあります (以下を参照)。
参考文献