web-dev-qa-db-ja.com

initはどのデバイスをmodprobeするかをどのように決定しますか?

私はnetbootingプロジェクト用に完全にカスタムのinitramfsを構築していて、その過程でそれについて多くを学んでいますが、モジュールのロードに少し戸惑っています。

modprobeを使用してモジュールをロードできることは知っていますが、ロードするモジュールをどのように決定しますか?

私が現在持っているのは、initramfsが仮想ボックスでシェルを起動して実行することです。しかし、lsmodはモジュールがロードされていないことを示しています。 initが必要なのは、ネットワークに適切なモジュールをロードして、ネットワークを立ち上げることです。

もし私が modprobe e1000実際に正しいモジュールをロードしました。

Ubuntuのブートプロセスを見ると、Ubuntuがロードする必要があると判断する方法がわかりませんe1000。利用可能なすべてのネットワークカードドライバがmodprobeだと思っていたかもしれませんが、そうではないようです。

UDEVはそれと関係があると思いますか?

5
Matt H

Modprobeを使用してモジュールをロードできることは知っていますが、ロードするモジュールをどのように決定しますか?

カーネルがカーネルに常駐していない機能を必要とする場合、カーネルモジュールデーモンkmod1 execs modprobeでモジュールをロードします。modprobeには、2つの形式のいずれかで文字列が渡されます。

  • Softdogやpppのようなモジュール名。
  • Char-major-10-30のようなより一般的な識別子

そこで、リンクから貼り付けるのではなく、システムで見つけたものについて説明します。

cat /proc/modules-このコマンドは、ロードされているモジュールをリストします。このリストは非常に大きなリストです。

さて、すでに述べたように、システムの起動時にkmodデーモンがmodprobeを実行してモジュールをロードします。すでに説明したように、2つの方法のいずれかでロードするモジュールを指定できます。汎用識別子を指定した場合、/etc/modprobe.confでそのエントリを探してエイリアスを探します。ですから、私の/etc/modprobe.confには、以下のようなエイリアスがあります。

alias eth0 tg3

そこで、以下のコマンドを実行して、システムのtg3が何であるかを確認しました。

-bash-3.2$ cat /proc/modules | grep tg3
tg3 139225 0 - Live 0xf8bd1000

次に、modprobeはファイル/lib/modules/version/modules.depを調べて、要求されたモジュールをロードする前に他のモジュールをロードする必要があるかどうかを確認します。このファイルはdepmod -aによって作成され、モジュールの依存関係が含まれています。

最後に、modprobeinsmodを使用して、最初に前提条件のモジュールをカーネルにロードし、次に要求されたモジュールをロードします。 modprobeは、insmodをモジュールの標準ディレクトリである/lib/modules/version/ [3]に転送します。 insmodはモジュールの場所についてかなりおかしくすることを目的としていますが、modprobeはモジュールのデフォルトの場所を認識しており、依存関係を理解し​​て正しい順序でモジュールをロードする方法を知っています。

しかし、新しいハードウェアはどのように検出されますか?

CPU Privilege rings

これらのリングは、OSではなくCPUによって作成されます。すべてのOSカーネルは、最も特権レベルの高いリング0で動作し、ハードウェアおよびCPUと直接通信できます。リング1と2は、一般的にデバイスドライバーに使用されます。また、リング3は、ユーザースペースアプリケーション(メディアプレーヤー、Webサーバー、およびユーザーが直接通信できるその他のもの)に使用されます。デバイスドライバーは、ユーザースペースアプリケーションとハードウェアの間の「架け橋」です。

Linuxカーネルは、すべてのコンピュータバスを常にスキャンして、変更や新しいハードウェアを探します。バスの変更が検出されると、魔法が始まります。

魔法

  1. ハードウェア情報をユーザースペースにエクスポート(SYSFS)
  2. *ハードウェアIS AVAILABLE(UEVENT AND UDEVD)であることをユーザースペースツールに通知する
    • ええ、あなたの仮定は正しいです。 udevは魔法と関係があります:)*
  3. プロセスUEVENTS、それらを/ETC/UDEV/RULES.D/のルールと照合し、/ DEVディレクトリ(UDEVDとUDEV)を反映する
  4. デバイスドライバのロード(UDEV、MODPROBLE)
  5. ユーザースペースアプリケーションに通知する(D-BUSを介して)

Udevdは、カーネルとすべてのudevシステムの間にあるデーモンであり、いくつかの重要な機能を実行します(後で説明します)。 udevデーモン(udevd)は起動時に開始され、/ etc/udev/rules.d /にあるすべてのルールを読み取って解析し、これらのルールをメモリ(udevデータベース)に保持して、udevでさらに使用できるようにします。その後、udevdは、カーネルドライバーコアからのueventをネットリンクでリッスンし始めます。

参考文献

7
Ramesh