HAL(Hardware Abstraction Layer,硬件抽象层)Windows NT的一个目标是使操作系统可跨平台移植。理想情况下,当一种新机器问世时,它应该可以仅仅使用新机器的编译器来重新编译这个操作系统,就让他首次运行。但是,现实中并不能这样做。虽然上层的操作系统能够完全移植(因为它们的处理大多是内部数据结构),但底层处理的是设备寄存器、中断、DMA和其他的硬件特性,这些都是因机器而不同的。即使大部分底层代码是用C语言编写的,它也不能仅仅从X86上拿出来放到Alpha上,然后重新编译、重新启动,因为X86和Alpha之间存在许多小的硬件差别,它们和不同的指令集相关并且不能被编译器隐藏。
微软认识到了这一点并尝试做一个很小的底层,以隐藏不同机器间的差异,这一层被称为硬件抽象层HAL。HAL的作用是将操作系统的其余部分表示为抽象的硬件设备,特别是去除了真正硬件所富含的瑕疵和特质。这些设备表现为操作系统的其它部分和设备可以使用的独立于机器的服务的形式(函数调用和宏)。通过使用HAL服务和间接硬件寻址,当移植到新的Windows设计的关键要素之一是,它能被移植到各种不同的硬件平台上。 硬件抽象层是使得这种移植性成为可能的一个关键部分。 HAL是一个可加载的、内核模式的模块,它提供了针对Windows当前运行所在的硬件平台的低层接口。它隐藏了与硬件相关的细节,比如I/O接口、中断控制器,以及多处理器通信机制——任何与体系结构相关或者与机器相关的功能 。
所以, Windows内部组件以及用户编写的设备驱动程序并不直接访问硬件;相反,当它们需要获得与平台相关的信息时,它们可以通过调用HAL例程来保持可移植性。出于这一原因,针对这些HAL例程,也有相应的文档包含在Windows DDK中。要想找到更多有关HAL及其在设备驱动程序中用法的信息,请参考DDK。
虽然 Windows随带了几个HAL,但是在安装的时候只有一个HAL被选中,并且被拷贝到系统磁盘上,其文件名为Hal.dll(其他的操作系统,比如VMS,在系统引导的时候选择一个等价于HAL的模块)。因此,如果支持两个不同处理器的HAL有所不同的话,你就不能这样假设:一个x86已安装系统的系统磁盘也可以在另一个处理器上引导。
在/Windows/Driver Cache/i386/Driver.cab中的x86 HAL列表
HAL文件名 | 所支持的系统 |
Hal.dll | 标准PC |
Halacpi.dll | 高级配置和电源接口(ACPI) PC |
Halapic.dll | 高级可编程中断控制器(APIC) PC |
Halaacpi.dll | APIC ACPI PC |
Halmps.dll | 多处理器PC |
Halmacpi.dll | 多处理器ACPI PC |
Halborg.dll | Silicon图形工作站(仅仅在Windows 2000中才有,市场上已经不再销售) |
Halsp.dll | Compaq SystemPro (仅仅在Windows XP中才有) |
注 从Windows Server 2003开始,在Windows基本系统中不再随带与特定厂商相关的HAL。
硬件抽象层:向下屏蔽硬件驱动模块的实现细节,向上提供硬件服务。
硬件抽象层的编写规范:
- 以模块的形式管理各个硬件的访问接口。
- 模块用结构体 hw_module_t 来描述。
- 硬件设备用结构体hw_device_t 来描述。
- 每个模块对应一个动态链接库文件。