2

私がドライバー開発に不慣れであることを述べて、この質問を限定させてください。RealTek 8187L チップを使用する USB Wi-Fi カードのドライバー ソース コードを理解しようとしています。以前の質問に対する適切な回答に基づいて、調査する必要のある関連ドライバー ソース コードがdrivers/net/wireless/rtl818x/rtl8187/dev.c(Linux カーネル ソース内に) あることを確認しました。

いくつかの読み取りを行うと、USB ドライバーusb_driverがカーネルに登録する構造体をインスタンス化するように見えます。これは、(とりわけ) ドライバーがサポートするデバイス ( .id_table)、サポートされるデバイスが接続されたときに実行する関数 ( .probe)、およびオプション.fopsで記述します、ユーザー空間との相互作用のための一連のファイル操作 ( )。usb_driver8187L ドライバーに関連付けられた構造体には、次のものが含まれていませ.fops

static struct usb_driver rtl8187_driver = {
    .name       = KBUILD_MODNAME,
    .id_table   = rtl8187_table,
    .probe      = rtl8187_probe,
    .disconnect = __devexit_p(rtl8187_disconnect),
    .disable_hub_initiated_lpm = 1,
};

module_usb_driver(rtl8187_driver);

したがって、ユーザー空間プログラムがこのドライバーとどのようにやり取りしてデータを送受信しているかについて興味があります。

Linux Journalの古い投稿(2001 年) には、次の抜粋があります。

fops およびマイナー変数はオプションです。ほとんどの USB ドライバー
は、SCSI、ネットワーク、または TTY サブシステムなど、別のカーネル サブシステムにフックします。これらのタイプのドライバーは、自分自身を他のカーネル サブシステムに登録し、ユーザー空間の対話はそのインターフェイスを介して提供されます。ただし、MP3 プレーヤーやスキャナーなど、一致するカーネル サブシステムを持たないドライバーの場合は、ユーザー空間と対話する方法が必要です。USB サブシステムは、マイナー デバイス番号と一連の file_operations [fops]関数ポインターを登録する方法を提供し、このユーザー空間の対話を可能にします。

したがって、8187L ドライバーはおそらく「別のカーネル サブシステムにフックする」ドライバーのようです。したがって、私の質問は、関数ポインターを提供しないドライバーの場合、この他のカーネルサブシステムとの相互作用はどのように行われるのでしょうか? 最終的には、プログラムが実際にやり取りしてデータを送受信しているドライバー コードのポイントを見つけて、コードの動作を引き続き分析できるようにしたいと考えています。.fops

4

2 に答える 2

3

個々のワイヤレス チップセットのドライバーは非常に低いレベルにあります。それとユーザー空間の間には多くのレイヤーがあります。rtl8187 の次の層は mac80211 です。drivers/net/wireless/rtl818x/rtl8187/dev.cへの呼び出しを観察しieee80211_register_hwます。この登録呼び出しは、mac80211 レイヤーと rtl8187 デバイス間のリンクを提供します。

次に、 にある の実装をieee80211_register_hw見てnet/mac80211/main.cください。それは を呼び出しieee80211_if_addnet/mac80211/iface.cを呼び出しますregister_netdevice。これにより、デバイスがカーネルのネットワーク インターフェイスのメイン リストに追加され、 や などで使用できるようifconfigになりrouteます。

ほとんどのユーザー空間プログラムは、ネットワーク インターフェイスと直接対話せず、パケットを IP アドレスに送信するだけで、カーネルはルーティング テーブルを使用して発信インターフェイスを選択します。

于 2012-07-27T03:47:51.083 に答える
0

RTL8187 ドライバーは、プローブ関数でおよびを呼び出して、IEEE 802.11 ワイヤレス ネットワーク サブシステムに自身を登録します。ieee80211_alloc_hw() ieee80211_register_hw()

于 2012-07-27T03:44:34.717 に答える