hal

    HAL,Hardware Abstraction Layer,硬件抽象层。Windows NT内核的操作系统一个目标是使操作系统可跨平台移植。

概况

    理想情况下,当一种新机器问世时,他应该可以仅仅使用新机器的编译器来重新编译这个操作系统,就让他首次运行。但是,现实中并不能这样做。虽然上层的操作系统能够完全移植(因为它们的处理大多是内部数据结构),但底层处理的是设备寄存器、中断、DMA和其他的硬件特性,这些都是因机器而不同的。即使大部分底层代码是用C语言编写的,它也不能仅仅从X86上拿出来放到Alpha上,然后重新编译、重新启动,因为X86和Alpha之间存在许多小的硬件差别,它们和不同的指令集相关并且不能被编译器隐藏。

开发过程

    微软认识到了这一点并尝试做一个很小的底层,以隐藏不同机器间的差异,这一层被称为硬件抽象层HAL。
HAL的作用是将操作系统的其余部分表示为抽象的硬件设备,特别是去除了真正硬件所富含的瑕疵和特质。这些设备表现为操作系统的其它部分和设备可以使用的独立于机器的服务的形式(函数调用和宏)。通过使用HAL服务和间接硬件寻址,当移植到新的硬件上时,驱动程序和核心只需做很少的改动。移植HAL本身是直接的,因为所有的机器相关代码都集中在一个地方,并且移植的目标是充分定义的,即实现所有的HAL服务。
    选择HAL中的服务是和主板上的芯片相关的,因为这些芯片从一个机器到另一个机器的变化是具有可预见限度的。换句话说,设计它是为了隐藏不同厂商主板之间的差别,而不是X86和Alpha之间的差别。HAL服务包括对设备寄存器的访问、总线独立的设备寻址、中断处理和复位、DMA传输、定时器和实时时钟的控制、底层的自旋锁(Spin Lock)和多处理机同步、BIOS接口以及CMOS配置内存。HAL没有提供对特殊I/O设备(如键盘、鼠标、硬盘和内存管理单元)的抽象或服务。
举一个例子来说明硬件抽象层的功能。考虑内存映射I/O和I/O端口的对比。一些机器具有前者,一些机器具有后者。驱动程序该怎样编写?是否使用内存映射呢?强制选择会使驱动程序无法移植到另一种实现方式的机器上,为此,硬件抽象层专为驱动程序的编写者提供了三个读设备寄存器的函数和另外三个写寄存器的函数:
    uc=READ_PORT_UCHAR(port); WRITE_PORT_UCHAR(port, uc)
    us=READ_PORT_USHORT(port); WRITE_PORT_USHORT(port, us)
    ul=READ_PORT_ULONG(port); WRITE_PORT_LONG(port, ul)
    这些函数分别读写无符号8位、16位、32位的证书到特定的端口。由HAL决定是否需要内存映射I/O,这样,一个驱动程序可以不被修改而在具有不同设备寄存器实现的机器间移植。
    驱动程序常由于各种原因而访问特定的I/O设备。在这个硬件层上,一个设备的某个总线上会有一个或多个地址。由于现代计算机常有多种总线(PCI、PCI-E、SCSI、USB等),很可能两个或更多设备具有相同的总线地址,因此需要通过某种方式来区分它们。HAL提供了一个服务,该服务通过将总线相连的设备地址映射到系统范围内的逻辑地址来识别设备。这样,驱动程序就不需要知道哪条总线上有哪个设备了。这些逻辑地址与操作系统为用户程序提供的指向文件和其他系统资源的句柄是类似的。这种机制也使总线结构的属性和寻址方式对于高层不可见。
    中断也存在类似的问题——它们也是总线相关的。同样,在这里,HAL为系统范围内的中断提供命名服务,并允许驱动程序以可移植的方法将中断服务例程和中断联系起来而不用知道哪个中断向量对应于哪条总线。此外,中断请求级别管理也在HAL处理。
    HAL提供的另一项服务是以一种设备独立的方式设置并管理DMA传输。系统范围内的DMA引擎与特定I/O卡上的DMA引擎都可以操作。对设备的访问是通过其逻辑地址进行的。HAL还实现了软件的分散、聚集(scatter/gather)(对非连续的物理存储块进行写或读)。
    此外,HAL还以一种可移植的方式管理时钟与定时器。时间记录以100ns为单位(起始于1601年1月1日),这样就比以2s为单位(起始于1980年1月1日)的MS-DOS事件记录精确得多,HAL还为许多发生于17.18.19世纪的计算机相关事件的记录提供了致贺词。这种时间服务将驱动程序从始终运行的实际频率中分离出来。
    内核组件(Kernel Component)有时需要在非常低的层次上同步,特别是为了避免多处理机系统中的竞争状态。HAL提供了一些原子方法来管理这种同步,如自旋锁——一个CPU仅仅等待一个由其他CPU占用的系统资源被释放,尤其是在资源只被几条机器指令所占用的情况下。
    最后,当系统启动以后,HAL与BIOS进行对话,并检查CMOS配置内存(如果有的话),以查明该系统包含了哪些总线和I/O设备,以及他们是如何配置的。之后这个信息会被存入注册表,这样,其他系统组件就能够查询它,而不必了解BIOS或配置内存如何工作。
    由于HAL高度依赖于机器,它必须与其所装入的系统完全匹配,因此,Windows的安装光盘上提供了许多种版本的HAL。系统安装时,选择一种合适的HAL并以hal.dll为名复制到硬盘上的系统目录windows\system32或winnt\system32下。之后所有的启动都使用该版本的HAL,删除这个文件将导致系统无法启动。

后语

    尽管HAL已经相当高效,但对于多媒体应用而言,它的速度可能还不够快。为此,微软公司另外提供了一个名为DirectX的软件包,它用附加的过程增强了HAL,并允许用户对硬件进行更直接的访问。DirectX在此不给予讨论。

posted @ 2015-07-22 22:40  柳安花明  阅读(399)  评论(0编辑  收藏  举报