HAL(Hardware Abstraction Layer)は、デスクトップアプリケーションがハードウェア情報に容易にアクセスできるように設計された、デーモン型の抽象化レイヤーです。このプロジェクトは、バスやデバイスの種類に依存せず、各種デバイスを統一的に利用できるようにすることを目指しています。これにより、GUIは一貫した形式で全てのリソースをユーザーに提示することが可能になります。
例えば、
リムーバブルメディアドライブの情報を収集し、メディアの挿入や取り出しといったイベントを
デスクトップ環境に通知する役割を担います。従来、デスクトップアプリケーションがハードウェアにアクセスするためには、
カーネルを直接利用する必要がありました。しかし、
カーネルは全てのデバイスについて詳細な情報を把握しているわけではないため、この方法では正確さに欠け、複雑な処理が必要でした。例えば、
MP3プレイヤーや
デジタルカメラなどが、ユーザインタフェース上では単なるハードディスクとして表示されることがありました。そのため、システムに接続されている周辺機器を一覧表示するような、使いやすいデスクトップインタフェースはほとんど存在しませんでした。
HALを導入することで、ハードウェアの種類ごとに重要な情報が統一された形式で利用できるようになります。新しいデバイスがシステムに追加された際には、デバイスの種類などの情報を含む非同期シグナルがシステムのメッセージバスにブロードキャストされます。このメッセージバスに接続しておくことで、デスクトップアプリケーションは新しいハードウェアを検出することができます。また、システムレベルのスクリプトを用いてデバイスを設定することも可能になり、事実上、HALは
プラグアンドプレイ機能を実現します。
HALデーモンは、デバイスのリストを実際のハードウェアの状態に合わせて常に最新の状態に保ちます。各デバイスの状態は、事前に定義されたキーと値の組で表現されます。各デバイスオブジェクトの識別には、Unique Device Identifier (UDI)という識別子が使用されます。キーと値のペアには型があり、HALの仕様で明確に定義されています。これにより、HALの利用者はそれらの意味を正確に理解することができます。
現在、HALは旧態化しており、メンテナンスのみが行われています。その機能は、DeviceKitやudevなどの新しい技術に移行しています。
参考情報:
HAL - Hardware Abstraction Layer at freedesktop.org
Making Hardware Just Work by Havoc Pennington (2003年7月)