私はnetbootingプロジェクト用に完全にカスタムのinitramfsを構築していて、その過程でそれについて多くを学んでいますが、モジュールのロードに少し戸惑っています。
modprobe
を使用してモジュールをロードできることは知っていますが、ロードするモジュールをどのように決定しますか?
私が現在持っているのは、initramfsが仮想ボックスでシェルを起動して実行することです。しかし、lsmod
はモジュールがロードされていないことを示しています。 init
が必要なのは、ネットワークに適切なモジュールをロードして、ネットワークを立ち上げることです。
もし私が modprobe e1000
実際に正しいモジュールをロードしました。
Ubuntuのブートプロセスを見ると、Ubuntuがロードする必要があると判断する方法がわかりませんe1000
。利用可能なすべてのネットワークカードドライバがmodprobe
だと思っていたかもしれませんが、そうではないようです。
UDEVはそれと関係があると思いますか?
Modprobeを使用してモジュールをロードできることは知っていますが、ロードするモジュールをどのように決定しますか?
カーネルがカーネルに常駐していない機能を必要とする場合、カーネルモジュールデーモンkmod
1 execs modprobe
でモジュールをロードします。modprobe
には、2つの形式のいずれかで文字列が渡されます。
そこで、リンクから貼り付けるのではなく、システムで見つけたものについて説明します。
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
によって作成され、モジュールの依存関係が含まれています。
最後に、modprobe
はinsmod
を使用して、最初に前提条件のモジュールをカーネルにロードし、次に要求されたモジュールをロードします。 modprobe
は、insmod
をモジュールの標準ディレクトリである/lib/modules/version/
[3]に転送します。 insmod
はモジュールの場所についてかなりおかしくすることを目的としていますが、modprobe
はモジュールのデフォルトの場所を認識しており、依存関係を理解して正しい順序でモジュールをロードする方法を知っています。
これらのリングは、OSではなくCPUによって作成されます。すべてのOSカーネルは、最も特権レベルの高いリング0で動作し、ハードウェアおよびCPUと直接通信できます。リング1と2は、一般的にデバイスドライバーに使用されます。また、リング3は、ユーザースペースアプリケーション(メディアプレーヤー、Webサーバー、およびユーザーが直接通信できるその他のもの)に使用されます。デバイスドライバーは、ユーザースペースアプリケーションとハードウェアの間の「架け橋」です。
Linuxカーネルは、すべてのコンピュータバスを常にスキャンして、変更や新しいハードウェアを探します。バスの変更が検出されると、魔法が始まります。
Udevdは、カーネルとすべてのudevシステムの間にあるデーモンであり、いくつかの重要な機能を実行します(後で説明します)。 udevデーモン(udevd)は起動時に開始され、/ etc/udev/rules.d /にあるすべてのルールを読み取って解析し、これらのルールをメモリ(udevデータベース)に保持して、udevでさらに使用できるようにします。その後、udevdは、カーネルドライバーコアからのueventをネットリンクでリッスンし始めます。