ドライバモジュールは自動的にロードおよびアンロードされますか?

ドライバモジュールは自動的にロードおよびアンロードされますか?

Ubuntu 14.04で外部ワイヤレスアダプタを接続しなくても、モジュールがrt2800usbまだ表示されることがわかりましたlsmod

  1. ドライバモジュールはいつ自動的にロードされますか?デバイスがコンピュータに接続されたときですか、それともオペレーティングシステムが起動したときですか?

  2. ドライバモジュールはいつ自動的に削除されますか?デバイスがコンピュータから取り外されたとき、またはオペレーティングシステムがシャットダウンしたときですか?

答え1

カーネルが新しいデバイスを検出すると、このプログラムを実行します。modprobeデバイスを識別する名前を渡します。ほとんどのデバイスは、ベンダーとモデル登録番号で識別されます。PCIまたはUSBアイデンティティ表示。プログラムmodprobeはモジュールエイリアステーブルを参照して、特定のデバイスのドライバを含むファイル名を見つけます。ファイルシステムや暗号化アルゴリズムなどの非ハードウェアデバイス用のドライバにも同様の原則が適用されます。詳細については、次を参照してください。/lib/modules/VERSION/modules.aliasDebian 再起動後にシリアル PCI カードが検出されない

modprobeが要求したドライバを含むモジュールファイル()を確認すると、.koモジュールファイルがカーネルにロードされます。モジュールコードは次のとおりです。動的ローディングカーネルを入力します。モジュールが正常にロードされると、リストに表示されますlsmod

カーネルが新しいホットプラグ対応ハードウェアを検出すると(たとえば、USB周辺機器を接続している場合)、モジュールは自動的にロードされます。さらに、オペレーティングシステムは、起動時に存在する周辺機器用のドライバをロードするために、起動時にシステム内のすべてのハードウェアを列挙します。

modprobeまたは、コマンドを使用してモジュールのロードを手動で要求することもできますinsmod。ほとんどのディストリビューションには、にリストされているモジュールをロードするための起動スクリプトが含まれています/etc/modules。モジュールをロードする別の方法は、モジュールの依存関係である場合です。モジュールAがモジュールBに依存している場合、modprobe AAがロードされる前にBがロードされます。

モジュールがロードされると、ドライバを使用しているすべてのデバイスが切断されても、明示的にアンロードされるまでロードされたままになります。ずっと前に未使用のモジュールを自動的にアンロードするメカニズムがありましたが、私の記憶が正しい場合はudevが登場したときに削除されました。私は自動モジュールのアンロードが一般的な機能ではないと思います。なぜなら、これを要求する傾向があるシステムは、ほとんど(ドライバコード規模で)多くのメモリを備えたデスクトップPCだからです。

答え2

システムが起動したら、次の方法でモジュールをロードします。初期RAMディスク(initrdとも呼ばれる)。根拠セクションには次のように記載されています。

多くのLinuxディストリビューションは、ディストリビューション開発者がさまざまなハードウェアから起動するために特別に作成した共通のLinuxカーネルイメージを提供します。この汎用カーネルイメージ用のデバイスドライバは、ロード可能なカーネルモジュールとして含まれています。多くのドライバを単一のカーネルに静的にコンパイルすると、カーネルイメージが大きくなり、メモリが限られたシステムで起動するには大きすぎる可能性があります。これにより、起動時にルートファイルシステムをインストールするために必要なモジュールを検出してロードしたり、ルートファイルシステムがどこにあるか何かを推測したりする問題が発生します。

他の多くのディストリビューションと同様に、Ubuntuはドライバが必要か、デバイスがシステムにあるかに関係なく、すべてのデバイスドライバをこのinitrdにロードすることを選択します。 Gilesが指摘したように、すべてがRAMにロードされ、起動時に使用されたモジュールが検出され、未使用のモジュールがRAMから削除されます。この方法では、設定に関係なく、Ubuntuは常にすべてのシステムで起動します。 Ubuntuはマイクロカーネル構造を使用してモノリシックカーネルを模倣します。バラよりこれをする理由


  1. このモジュールはrt2800usb次に含まれているため、起動時に常にロードされます。ファイルシステムの初期化ザイルズが言及した。 initramfsはinitrdの後続であるため、常にとしてマークされますlsmodmodprobeモジュール名に従って、新しくコンパイルされたモジュールをカーネルに挿入できます。

テストでワイヤレスアダプタを取り外した状態でシステムを再起動します。すべてが順調に進むと、lsmod起動中にinitramfsとinit sstemによって開始された計測プロセスが計測中にデバイスを見つけられず、モジュールがRAMから削除されたため、モジュールはs出力に表示されません。

  1. システムの実行中にモジュールを削除するには、rmmodまたはなどのコマンドmodprobe -rの後にモジュール名を入力します。次回の起動時にモジュールが再ロードされます。探す。ほとんどの場合、モジュールはホットプラグを無効にするため、動的に削除されません。つまり、モジュールが取り外されると、そのモジュールを使用しているデバイスを再挿入すると再検出できません。

モジュールを削除するには、lsmod選択したモジュールなしでカーネルを再コンパイルし、イメージを再構築して生成されたinitramfsイメージからそのモジュールを削除する必要があります。これにより、モジュールのすべての計測が無効になります。

関連情報