
私はネットワークブートプロジェクトのための完全にカスタマイズされたinitramfsを構築し、その過程で多くのことを学んでいますが、モジュールのロードについて少し混乱しています。
モジュールをロードするために使用できることはわかっていますが、modprobe
ロードするモジュールをどのように決定しますか?
私が今持っているのは、仮想ボックスでシェルが実行されているinitramfsです。ただし、lsmod
モジュールがロードされていないとマークされます。私がすべきことは、init
ネットワークを設定できるように正しいネットワークモジュールをロードすることです。
modprobe e1000
実際に正しいモジュールを読み込むと。
Ubuntuの起動プロセスを見ると、Ubuntuがどのようにロードするかを判断できませんe1000
。私はそれが利用可能なすべてのネットワークカード用のドライバであると思いましたがmodprobe
、そうしないようです。
UDEVがこれに関連していると思いますか?
答え1
modprobeを使用してモジュールをロードできることを知っていますが、ロードするモジュールをどのように決定しますか?
カーネルがカーネルに存在しない機能を要求するとき、カーネルモジュールデーモンkmod
1execsは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
モジュールの依存関係によって生成され、含まれます。
最後に、要求されたモジュールをロードする前に、まずすべての前提条件モジュールをカーネルにロードするためにmodprobe
使用されます。モジュールの標準ディレクトリである[3]を指します。モジュールの位置について非常に愚かなことを目指していますが、モジュールの基本的な位置を知るには、依存関係を特定し、正しい順序でモジュールをロードする方法を知る必要があります。insmod
modprobe
insmod
/lib/modules/version/
insmod
modprobe
しかし、新しいハードウェアはどのように検出されますか?
これらのリングは、オペレーティングシステムではなくCPUによって生成されます。すべてのオペレーティングシステムカーネルは、最高の特権レベルであるリング0で実行され、ハードウェアおよびCPUと直接通信できます。リング 1 と 2 は通常デバイスドライバで使用されます。 Ring 3は、ユーザースペースアプリケーション(メディアプレーヤー、Webサーバー、およびユーザーが直接通信できる他のすべて)のためのものです。デバイスドライバは、ユーザ空間アプリケーションとハードウェアの間の「ブリッジ」です。
Linuxカーネルは、すべてのコンピュータバスで変更と新しいハードウェアを継続的に検索します。バスで変化が検出された瞬間、魔法が始まります。
魔法
- ハードウェア情報をユーザースペース(SYSFS)にエクスポートする
- *ハードウェアが利用可能であることをユーザースペースツールに通知します(UEVENTおよびUDEVD)
- はい、あなたの家は正しいです。 udevは魔法についてです:)*
- イベントを処理し、/ETC/UDEV/RULES.D/のルールと一致し、/DEVディレクトリ(UDEVDおよびUDEV)を入力します。
- デバイスドライバのロード(UDEV、MODPROBLE)
- ユーザー空間アプリケーションへの通知(D-BUS経由)
udevdはカーネルとすべてのudevシステムの間にあり、いくつかの重要な機能を実行するデーモンプロセスです(後で説明します)。 udevデーモン(udevd)は起動時に起動され、/etc/udev/rules.d/のすべてのルールを読み取り、解析し、udevで後で使用できるようにこれらのルールをメモリ(udevデータベース)に保存します。後で、udevd はカーネルドライバコアの uevent に対して netlink でリッスンを開始します。