HAL层被称为硬件抽象层,它位于操作系统内核和硬件电路之间的接口层,目的是将硬件抽象化。它隐藏了特定平台的硬件接口细节,为操作系统提供虚拟的硬件平台,使其具有硬件无关性,这样就可以在多种平台上移植。
在Android源码中,HAL层被保存下面的目录中
1.libhardware_legacy:过去的目录,采取了链接库模块观念
2.libhardware:新的目录,采用HAL stub观念,它是一种代理的概念.
3.ril:是radio接口
4.msm7k:QUAL平台相关的信息
比较HAI_legacy和HAL
HAI_legacy:采用共享库形式,在编译时候会调用到。由于采用function call形式来调用,因此可被多个进程使用,但是会被映射到多个进程空间中造成浪费,同时需要考虑代码能否安全重入的问题。
HAL:采用HAL module和HAL stub结合形式。HAL stub不是一个共享库,在编译时候上层只拥有访问HAL stub的函数指针,并不需要HAL stub。在上层通过HAL module提供的统一接口获取并操作HAL stub,所以文件只会被映射到一个进程。
HAL modulefe分析
在/hardware/libhardware/hardware.c里
1.hw_get_module函数
int hw_get_module_by_class(const char *class_id, const char *inst,
const struct hw_module_t **module)
{
..........
/* Loop through the configuration variants looking for a module */
for (i=0 ; i<HAL_VARIANT_KEYS_COUNT+1 ; i++) {
if (i < HAL_VARIANT_KEYS_COUNT) {
if (property_get(variant_keys[i], prop, NULL) == 0