0

PCI に接続された 2 つのデバイスがあります。また、汎用ソケット コードを使用する両方のデバイスのコードもあります。(デバイスは元々 MII/Ethernet で接続されていました。)

ここで、2 つのデバイス間でパケットをやり取りするための PCI デバイス ドライバーを作成する必要があります。

ソケット コードによって開かれたファイル記述子にアクセスするにはどうすればよいですか? これは、キャラクターデバイスファイルにアクセスすることと同じですか?

PCI ドライバーは、何らかの方法でコード内の read() および write() からパケットをキャプチャする必要があります。

ありがとう!

4

1 に答える 1

0

あなたの質問に対する答えは次のとおりです。(1) そうではありません。(2) いいえ。

ファイル記述子はユーザー空間の概念であり、カーネル ドライバーはユーザー空間の概念と対話しません。(はい、それらはカーネルによって実装されていますが、他のデバイス ドライバーはそれらを直接操作することはできず、間接的に操作することもできません。)

カーネルがアクセス可能なメモリ空間にバッファリングされたデータを受信し、それをハードウェアに送信してから、ハードウェアからデータを受信し、(要求された場合) カーネルがアクセス可能なメモリのバッファに書き込むメソッドを実装します。 .

これを行うには、キャラクター デバイス ドライバー API と PCI デバイス ドライバー API を実装し、ドライバーを PCI デバイスとして登録し、次にキャラクター デバイスとして登録します。これらのメソッドの一部はファイル構造を参照する場合がありますが、それらはあなたがよく知っているユーザーランド構造ではありません。

イーサネット プロトコルを実装するデバイスの場合、代わりに Net Device Interface を実装するため、作業が楽になります。このように、ハードウェアとの間でデータを取得するために必要な部分を記述するだけです。

必要なのは、デバイス ハードウェアの仕様、PCI レジスタと領域を使用してハードウェアを制御する方法です。

幸いなことに、これを一人で行う必要はありません。カーネル開発者の大規模なコミュニティと、Linux カーネルの開発に関する優れた (そして最新の) 本がいくつかあります (以下を参照)。

参考文献

于 2010-06-19T01:07:00.010 に答える