どちらもカーネルイベントを受信して処理しているようですが、なぜ両方が存在するのですか?私が収集したところによると、ACPIはudevに比べて高レベルのようですが、それを除けば実際にはわかりません。
[〜#〜] acpi [〜#〜]は、メインボードベンダーが()では不可能な組み込みデバイスに関する情報を提供するための低レベルのインターフェイスです。確実に)オペレーティングシステムに自動検出されます。また、カーネルに電源管理とハードウェア監視の方法を提供します。 ACPIが提供する興味深いものの1つは、いわゆるACPIイベントです。これらを作成するために、組み込みハードウェアで何かが発生すると、ハードウェアは特別な割り込み(汎用イベント割り込み)を発行し、カーネルはACPIコードを呼び出して、どの組み込みデバイスで何が発生したかを判別します。全体がどのように機能するかを詳細に知りたい場合は、 仕様 を参照してください。
acpidは、カーネル内のACPIサブシステムによって生成されたイベントをリッスンし、特定のイベントが発生したときにコマンドを実行できるようにするデーモンです。たとえば、ハードウェアがACPIを介して電源ボタンが押されたことを通知した場合、「ボタン/電源」クラスのデバイスでイベントが発生します。デーモンは、ACPIを介して生成されたこれらのイベントにのみ反応でき、たとえば、 USBバス。
udevは、カーネルによって管理されるデバイスツリーの変更に対応できるLinux固有のデーモンです。たとえば、USBスティックを差し込むと、カーネルはUSBコントローラーによって通知され、新しいデバイスがLinuxデバイスツリーに追加されます。次に、usb_storage
ドライバーは、新しいデバイスがストレージデバイスであることを検出し、ツリー内にサブデバイスノードを作成して、ユーザースペースが他のハードドライブと同じようにUSBスティックを処理できるようにします。プラグを抜くと、これらのデバイスはツリーから削除されます。 udevは、これらの追加と削除のそれぞれについて通知されます。 udevは、CDトレイの開閉など、デバイスの追加/削除ではないいくつかのイベントにも反応できますが、それがほとんどです。 udevadm monitor --kernel
を実行して、udevがリアルタイムで取得するイベントを確認できます。
acpidとudevは互いに補完し合っていると言えます。 udevは、OSが認識しているデバイスに関する大きな変更に対応するのに役立ちますが、acpid一部の組み込みデバイスで発生するより具体的なイベントに対応するのに役立ちます。