ハードウェア抽象化レイヤー、通称HALは、
コンピュータの
ハードウェアとそれに対応する
ソフトウェアの間に存在し、両者の間での情報のやり取りをスムーズにする役割を果たします。HALは特に
オペレーティングシステム(OS)の
カーネルと
ハードウェアとの間で、個別の
ハードウェアの違いを隠す機能を持っており、これにより
カーネルコードは多様な
ハードウェア環境でもほとんど手を加えずに動作可能です。
HALの役割と目的
一般的に、HALはPCにおいて
マザーボード用ドライバの形式で実装されており、上位のプログラムは
ハードウェアの低レベルのコンポーネントに対して指示を出すことができます。このアプローチにより、開発者は
ハードウェアの詳細を気にせずにシステム設計を行うことが可能となります。特に、
Microsoft WindowsのNT系OSでは、HALは重要な役割を果たしており、
カーネル空間内に配置されて
カーネルやドライバ、実行サービスと
ハードウェアの仲介を行います。
これにより、Windows NT
カーネルのコードは異なる
メモリ管理ユニットやI/Oバスアーキテクチャにおいても互換性を持ち、ほとんど手を加えずに移植できる形で設計されています。コードは、特別な修正を行うことなく、対象となるシステムに対して単に命令セットアーキテクチャをコンパイルするだけで実行できるのです。
他のOSにおけるHALの位置づけ
HALと呼ばれる構造は、BSDやmacOS、
Linux、あるいは
Solarisなどの他の
オペレーティングシステムにも存在していますが、それらは必ずしもHALとして明確に識別されているわけではありません。例えば、
Linuxの場合、AdeosのようなHALを動作中の
カーネルに挿入することができます。また、
NetBSDはHALを明確に分離しており、非常に高い移植性を誇ります。このシステムは、uvm(9)、pmap(9)、bus_space(9)、bus_dma(9)など複数のサブシステムによって構成されています。さらに、ISA、EISA、PCI、PCI-Expressなど、多様なアーキテクチャで使用されているI/Oバスも抽象化され、
デバイスドライバは最小限の修正で移植が可能となっています。
HALの具体例
HALの極めて明確な例として
System/38|System_38やAS/400のアーキテクチャが挙げられます。これらのシステム上では、
コンパイラが抽象化された機械語コードを生成し、Licensed Internal Code(LIC)がそのコードを実際に動作させるために必要なプロセッサ用コードに変換します。これにより、上位のアプリケーションやOSのコードは、
System/38|System_38からAS/400に移行する際に、全く修正する必要がなくなります。これらのシステムは、異なるプロセッサを使用するにも関わらず、非常にスムーズに移行ができるのです。
HALとOSのAPIの関係
HALは、OSのAPI層よりも低位に位置します。言い換えれば、HALを介して行われる処理は、OS
システムコールに基づくAPIよりも短い時間で完了しなければなりません。このため、HALを利用することで、様々な
ハードウェアにおいても簡単に移植可能なOSを実現することが可能となります。特に、
組み込みシステムなど多様なプラットフォームでの動作が求められる場面では、この柔軟性が非常に重要です。
HALを含む技術 - DirectXの役割
Windows向けのマルチメディア処理を行うAPIであるDirectXにもHALに関連したコンポーネントがいくつか存在します。特に、リアルタイム3次元グラフィックス処理を担当する
Direct3Dでは、グラフィックス
ハードウェアを抽象化するためのHALデバイスが用意されています。これにより、異なるベンダーの間での
ハードウェアの違いを吸収しながら、共通の
Direct3D APIを通じて
ハードウェア機能にアクセスできるため、開発者にとって利便性が高まります。なお、
DirectDrawにはユーザーモードでのエミュレーションを可能にするHardware Emulation Layer(HEL)が実装されていました。また、
DirectSoundもサウンドカードの支援を利用するHALを持っていましたが、Windows Vista以降は
ソフトウェアエミュレーションに置き換えられています。
このように、HALは
コンピュータシステムの基本的な設計原則において、
ハードウェアと
ソフトウェアの仲介を行う重要な役割を果たしていると言えます。