现在的位置: 首页 > 综合 > 正文

什么是HAL 硬件抽象层

2014年10月13日 ⁄ 综合 ⁄ 共 2551字 ⁄ 字号 评论关闭

HAL: hardware abstraction layer 硬件抽象层

这个是李先静的blog的解释,真是天下何处不逢君啊

HAL是Hardware Abstraction Layer的首字母缩写。我最早是在Winnt 3.5的帮助中知道这个名词的,对帮助文档中的说法我比较认同,所以一直对它抱有好感。不过Windows下的HAL和Linux下的HAL两者所指并非相同之物:

Windows下的HAL:位于操作系统的最底层,直接操作物理硬件,隔离与硬件相关的信息,为上层的操作系统和设备驱动程序提供一个统一的接口,起到对硬件的抽象作用。有了HAL,编写驱动程序就容易多了,因为HAL的接口不但使用简单,而且具有更好的可移植性(没用过)。

Linux 下的HAL:至于对硬件的抽象,Linux内核早就有类似机制,只不过没有专门的名称罢了。而Linux的HAL指的并非这个,它不是位于操作系统的最底层,直接操作硬件,相反,它位于操作系统和驱动程序之上,是一个运行在用户空间中服务程序。

我们知道,Linux和所有的Unix一样,习惯用文件来抽象设备,任何设备都是一个文件,比如/dev/mouse是鼠标的设备文件。这种方法看起来不错,每个设备都有统一的形式,但使用并不那么容易,设备文件名没有什么规范,从简单的一个文件名,你无法得知它是什么设备,具有有什么特性。
结果形成这样的尴尬:有了设备和设备驱动程序,却不知道如何使用它。这些乱七八糟的设备文件,让设备的管理和应用程序的开发都变得很麻烦,所以有必要提供一个硬件抽象层,来为上层应用程序提供一个统一的接口,Linux的HAL就这样应运而生了。
但HAL并不提供诸如拍照和刻录等之类的功能,相反它只是告诉应用程序,系统中有哪些设备可用,以及这些设备的类型、特性和能力等。主要说来,它提供以下几项功能:
1. 获取指定类型的设备列表。
2. 获取/更改设备的属性值。
3. 获取设备具有的能力描述。
4. 设备插入/拔除时,通知相关应用程序。
5. 设备属性或能力变化时,通知相关应用程序。
udev创建dev下的文件结点,加载驱动程序,让设备处于可用状态。而HAL则告诉应用程序,现在有哪些设备可用,这些设备的类型、特性和能力,让应用程序知道如何使用它们。

udev 是 Linux kernel 2.6 系列的设备管理器。它主要的功能是管理 /dev 目录底下的 设备节点。它同时也是用来接替 devfs 及hotplug 的功能,这意味着它要在添加/删除硬件时处理 /dev 目录以及所有用户空间的行为,包括加载 firmware 时。(Udev中的U有人说是指代user?期待更“权威”的解释 )
udev的最新版本依赖于升级后的Linux kernel 2.6.13的uevent接口的最新版本。使用新版本udev的系统不能在2.6.13以下版本启动,除非使用noudev参数来禁用udev并使用传统的 /dev 来进行设备读取。
在传统的Linux系统中,/dev目录下的设备节点为一系列静态存在的文件,而udev则动态提供了在系统中实际存在的设备节点。虽然devfs提供了类似功能,udev的支持者也给出了很多udev实现比devfs好的理由

* udev支持设备的固定命名,而并不依赖于设备插入系统的顺序。默认的udev设置提供了存储设备的固定命名。任何硬盘都根据其唯一的文件系统id、磁盘名称及硬件连接的物理位置来进行识别。
* udev完全在用户空间执行,而不是像devfs在内核空间一样执行。结果就是udev将命名策略从内核中移走,并可以在节点创建前用任意程序在设备属性中为设备命名。

udev是一个通用的内核设备管理器。它以守护进程的方式运行于Linux系统,并监听在新设备初始化或设备从系统中移除时内核(通过netlink socket)发出的uevent。
系统提供了一套规则用于匹配可发现的设备事件和属性的导出值。匹配规则可能命名并创建设备节点,并运行配置程序来对设备进行设置。udev规则可以匹配像内核子系统、内核设备名称、设备的物理等属性,或设备序列号的属性。规则也可以请求外部程序提供信息来命名设备,或指定一个永远一样的自定义名称来命名设备,而不管设备什么时候被系统发现。
固件(firmware),台湾、港澳作“韧体”,在计算机中是一种嵌入在硬件设备中的软件。通常它是位于闪存或EEPROM和PROM中,而且可以让用户更新。(Maybe可以这么拓展一下:hardware、firmware、software)
顾名思义,固件的所在是位于软件和硬件之间的。像软件一样,他是一个被计算机所运行的程序。然而它是对于硬件内部而言更加贴近以及更加重要的部份,而对于外在的世界而言较无重要的意义。
固件的示例包含:

* 个人计算机中的BIOS
* 升阳计算机和苹果计算机的计算机中使用的Open Firmware
* 在只读存储器中的计算机程序(硬件的设置通常用软件的方式来表示)
* 在可编程化只读存储器中,这些程序只可以被特别的外部硬件来更改,而不能经由应用程序更新

未经授权地更改固件有时候可以得到制造商不提供的功能或规避某些侦测,例如使DVD播放机的区码功能失效。
“固件”这个名词是源自于为了 如AMD29xx所写之微程序之微程序。后来它被当成取代一个低价的微处理器里的一部分功能。
实际而言,规律的固件的升级可以提升效能以及可靠性。在众多的有规律的固件升级中烧录设备是其中之一,比如说光源烧录器(DVD, CD, HD DVD, Blu-ray),随着媒体技术的日新月异,固件的更新可以确保硬件保持在最新的状态以及确保其兼容性。
固件已经演进为一个硬件设备当中的可编程化的内容,比如说固件可能包含有一处理器之机器码或者固定功能之设备,或是闸道数组或者可编程化之逻辑器件之设置。
固件的一个一般性的特色是它可以被在生产后或用电子的方式或者用取代储存媒介的方式更新。
固件可以 — 但并非必需 — 暴露出一个可由外界连接的界面。比如说在某些调制解调器的实现中,固件并非可以直接访问,但却是由硬件以及韧体所组成回应主机的一部分。
固件原本被存放在于ROM中,然而价格以及效能的需求已经让原件供应商妥协于其他的替代方案,包含了非易失性的媒体比如说EEPROM以及闪存或是SRAM的解决方案。

抱歉!评论已关闭.