1

一般的な観点から、ユーザー空間からプラットフォーム デバイスにアクセスする方法を見つけようとしています。具体的に言うと、デバイス ツリーに追加した EMIF コントローラーと SoC があり、事前に作成された EMIF プラットフォーム デバイス ドライバーに正しくバインドされていると思います。現在、ユーザー空間アプリケーションからこの EMIF デバイスにアクセスする方法を見つけようとしています。この問題に何らかの関連があると思われるいくつかの異なるトピックに出くわしましたが、それらがどのように関連しているかはよくわかりません.

1) 私が読んだように、ほとんどの I/O は によって作成されたデバイス ノードを使用して行われているようですがmknod()、このデバイスにアクセスするにはデバイス ノードを作成する必要がありますか?

2)ユーザー空間とプラットフォームデバイスドライバーの両方とインターフェースし、それを仲介として使用できるカーネルモジュール(キャラクター?、ブロック?)の作成について話しているスレッドをいくつか読みました。

mmap()3) を使用して、プラットフォーム デバイスのメモリを仮想メモリ空​​間にマップする可能性について読みました。これは可能ですか?

4) EMIF ドライバーがインスタンス化されると、関数が呼び出されるprobe()ようです。ユーザースペース アプリケーションがドライバーで呼び出す関数は何ですか?

4

2 に答える 2

2

何をする必要があるかは完全には明らかではありません (特に EMIF や「プラットフォーム デバイス」の経験がないことに注意してください) が、開始に役立つ概要を以下に示します。

  1. はい、デバイスへのアクセスを提供する通常の方法は、デバイス ノード経由です。通常、このアクセスは、より具体的な方法がない限り、キャラクター デバイス ドライバーによって提供されます。ほとんどの場合、アプリケーションがドライバーと「直接」通信している場合、それはキャラクター デバイスです。他のほとんどのタイプのデバイスは、他のカーネル サブシステムとのインターフェイスに使用されます。ネットワーク ドライバーは、カーネル内の TCP/IP スタックなどからネットワークへのアクセスを提供します。

    ドライバーでサポートできる char デバイス メソッドまたはエントリ ポイントがいくつかありますが、最も一般的なのは "read" (つまり、ユーザー空間プログラムがデバイスを開き、そこから read(2) を実行する場合)、"write" です。 (write(2) に類似) および "ioctl" (自然に読み取りまたは書き込みに分類されない構成/管理タスクによく使用されます)。mknod(2) は、デバイスのユーザー空間側のみを作成することに注意してください。対応するデバイス ドライバーがカーネルに存在する必要があります (mknod 呼び出しで指定された「メジャー デバイス番号」は、ユーザー空間ノードをドライバーにリンクします)。

    ファイル システムに実際にデバイス ノードを作成する場合、デバイスのセットアップ中に適切なカーネル関数を呼び出すと、これを自動化できます (つまり、ノードは /dev に自動的に表示されます)。カーネルから通知を取得し、mknod(2) システム コールを実行して応答する特別なデーモンがあります。

  2. カーネルモジュールは、ドライバーまたはその他のカーネル拡張機能を作成するための動的にロード可能な方法にすぎません。キャラクター、ブロック、またはネットワーク デバイス (その他) を作成できますが、静的にリンクされたモジュールも作成できます。機能にいくつかの違いがあります。これは主に、使用したいすべてのカーネル関数が動的にロードされたモジュールに「エクスポート」される (つまり、可視になる) わけではないためです。

  3. デバイス メモリのユーザー仮想メモリ空​​間へのマッピングをサポートできます。これは、さらに別のドライバー エントリ ポイント (mmap) によって実装されます。char ドライバーがサポートできるすべてのエントリ ポイントについては、struct file_operations を参照してください。

  4. これはほとんどあなた次第です。それは、アプリケーションが何をする必要があるかによって異なります。カーネルには、ユーザー空間に直接機能を提供せず、他のカーネル コードにのみ提供する多くのドライバーがあります。「プローブ」に関しては、さまざまなインターフェースで定義されている多くのプローブ機能があります。ほとんどの場合、これらはカーネル (またはおそらく「より高いレベルの「クラス」ドライバー」) によって呼び出され、特定のドライバーが個々のデバイスを検出、識別、および「要求」できるようにします。それら (プローブ関数) は通常、ユーザー空間からのアクセスを提供することとは直接関係ありませんが、特定のインターフェイスで何かが欠けている可能性があります。

于 2014-04-08T22:03:13.537 に答える
0

デバイスにアクセスするには、デバイス ノードを作成する必要があります。

ドライバーが一致するデバイスを見つけると、プローブ関数が呼び出されます。

プラットフォーム デバイス API の詳細については、次の記事が役立ちます。

プラットフォーム デバイス API プラットフォーム デバイスとデバイス ツリー

于 2014-04-10T10:17:56.643 に答える