Linuxは/devにデバイスがないときに "wlan0"をどのように見つけて設定しますか?

Linuxは/devにデバイスがないときに

(Raspberry Pi Zero W、カーネル4.14y)ワイヤレスアダプタチップは、/ dev fsのデバイスではなく、ifconfigが知っているものの名​​前のようです。私が知る限り、これはBerkley Socketsのアーティファクトです。

これはハードウェアなので、デバイスツリーで言及する必要があるとします。一部のドライバをロードしますが、/ dev(devfs)にエントリを作成することはできません。

ソケットはデバイスではなく、このデバイスをどこで/どのように探しますか?

ベストアンサー1

/devLinuxでは、ネットワークインターフェイスにデバイスノードがまったくありません。

使用可能なネットワークインターフェイスのリスト(スクリプトなど)が必要な場合は、ディレクトリを表示すると/sys/class/net/各インターフェイスのシンボリックリンクが表示されます。ロードされたドライバを含む各ネットワークインターフェイスが一覧表示されます。

if_nameindex()プログラムでシステムコールを使用できます。Stack Overflowでこの回答を参照してください。

さらに、/devこれはデバイスファイルシステム

これデバイスツリー具体的には異なる意味を持ちます。言い換えれば、システムのハードウェアコンポーネントの機械可読説明である。プラグアンドプレイ機能を持たないハードウェアバス、または自動検出できないハードウェアがあるシステムで使用されます。たとえば、Raspberry PiなどのARM SoCのLinuxでは、デバイスツリーを使用します。

RasPiの開始順序は非常に興味深いです。RasPi.SEでこの質問を参照してください。

つまり、起動時にファイルが制御される/boot/start.elfと、GPUはデフォルトの/boot/*.dtbARM CPUが起動する前にそのファイルと/boot/overlay/*.dtboファイルをロードします。ファイル*.dtbコンパイルされたデバイスツリーバイナリ形式で。各特定のRasPiモデルで見つけることができるハードウェアについて説明し、次のように表示されます。デバイスツリーのソースコードファイル(.dts`)は特定の方法でフォーマットされたテキストにすぎません。

デバイスツリーのカーネルライブイメージは /sys/firmware/devicetree/base で見ることができます。 パシロサンティリ、次のように.dts形式で表示できます。

sudo apt-get install device-tree-compiler
dtc -I fs -O dts /sys/firmware/devicetree/base

デバイスツリーファイル形式の仕様はここで確認できます。この仕様はオペレーティングシステムに依存しないように書かれています。また必要があるかもしれませんデバイスツリー参照いくつかの詳細について説明します。

したがって、元の質問に対する答えは次のようになります。

  • Berkeley Sockets APIカーネルからネットワークインタフェースを取得する
  • カーネルは、デバイスツリーファイルから必要なハードウェア情報を取得します。
  • デバイスツリーファイルは設定に従ってGPUによって/boot/start.elfロードされます。/boot/config.txt
  • デバイスツリーファイルは、最初に各RasPiモデルのハードウェア仕様に基づいて生成され、適切なバイナリ形式にコンパイルされます。

デバイスツリー検索コードは、主に各ハードウェアの有効なドライバを見つけることに関連しています。各デバイスについてあまり気にしません。目的:これがドライバーの仕事です。

ドライバは適切な*_register_driver()カーネル機能を使用して自分の存在を記録し、デバイスツリー情報の適切な部分を使用して実際のハードウェアを見つけ、他の機能を使用してそのハードウェアを制御できるように登録します。ドライバがハードウェアを初期化すると、register_netdev()カーネル機能を使用して自分自身を新しいハードウェアとして登録します。ネットワークインターフェース何よりも、これはソケットAPI(別のエンティティではなくカーネルへの別のインターフェイスです)がネットワークインターフェイスの存在を認識するようにします。

ethtoolドライバは他の仕事のために自分自身を登録することもできます。リンク状態の監視、トラフィック統計、およびその他の下位レベルの機能をサポートする多くのタスクを一覧表示し、ワイヤレスカードドライバはregister_wiphy()これを使用して次のように宣言します。ワイヤレス電話特定のWi-Fi機能を備えたネットワークインターフェースです。

Linux TCP/IP スタックには多くのインターフェースがあります。 Berkeley Sockets APIは、アプリケーションプログラマーに最もよく知られています。 netdev APIは、本質的にドライバにとって同じコインの反対側です。

おすすめ記事