Android中 的HAL层简析

时间:2024-03-29 20:33:12

Android中 的HAL层简析

@(读书笔记)[HAL层]

HAL(HardWare Abstraction Layer,硬件抽象层),在 LinuxWindows下操作系统下有着不同的实现方式。
Windows下的HAL位于操作系统的最底层,它直接操作物理硬件设备,使用抽象接口来隔离不同硬件的具体实现,为上层的操作系统和设备驱动程序提供一个统一接口,起到对硬件抽象作用。这样更换硬件时,编写硬件的驱动只要实现符合HAL定义的标准接口就可以顺利进行硬件更换,而对上层的应用没有影响。
Linux下的HALWindows不同,HAL层并不位于操作系统的最底层直接操作硬件,而是在操作系统内核层和驱动程序之上,是一个运行在User Space(用户空间)的服务程序。

1.HAL结构

要想知道androidHAL的结构,我们首先看看来自于HAL0.4.0 Specification的框架图。
Android中 的HAL层简析
    HAL位于操作系统和驱动程序之上,运行在用户空间中的服务程序。其目的是为上层的应用提供一个统一的查询硬件设备的接口。有了HAL接口,就可以将硬件开发和上层的应用开发分离开,上层的应用开发不必关系具体实现是什么硬件,同样地,如果硬件厂家需要改变硬件设备,只需要按照HAL接口的规范和标准提供对应的硬件驱动,而不必更改应用。(HAL层并不提供对硬件的实际操作,对硬件的实际操作仍然由具体的驱动程序来完成。)

2.Android引入HAL层的原因

    HAL层的优势我们在前面已经提到,这是其中之一,另一个重要的原因就是为了保障在Android 平台基于Linux开发的硬件驱动和应用程序不必遵循GPL(General Public License)许可而保持封闭,保证硬件厂家的利益。我们都知道, Linux KernelAndroid的许可证不一样,Linux Kernel遵循的是GPL许可,Android遵循的是ASL(Apache SoftWare License)许可,ASL许可规定,可以随意使用源码,不必开源,所以建立在Android之上的硬件驱动和应用程序都可以保持封闭。也就是说,只要把 关键的驱动处理相关的主要逻辑转移到Android平台内,在Linux Kernel中国仅保留基础的通信功能,原本应该包括在Linux Kernel中的某些驱动的关键处理逻辑,被转移到了HAL层,保证了硬件厂家的利益的同时,也方便了软件的开发。

3.Android中HAL的运行机制。

    Android源码中已经实现了一部分的HAL,包括Wi-Fi、GPS、RIL、Sensor等。这些代码主要储存在以下目录:
- Android_src/hardware/libhardware_legacy:老式的HAL结构,采用直接调用so动态链接库方式。
- android_src/hardware/libhardware:新式HAL结构,采用Stub代理方式调用。
- Android_src/hardware/ril:RIL(Radio Interface Layer,无线通信接口层)。

Android中 的HAL层简析
    如上图所示,左图为老式的HAL结构,应用或者框架通过so动态链接库调用而达到对硬件驱动的访问。在so动态链接库中,实现了对驱动的访问逻辑处理。右图为新式HAL结构,该结构采用Proxy代理模式,Stub虽然仍是以*.so的形式存在,但是HAL已经将*.的具体实现隐藏了起来。StubHAL提供operations方法,Runtime通过对Stub提供的so获取它的operations方法,并告知Runtimecallback方法。这样,RuntimeStub都有对方调用的方法,一个应用的请求通过Runtime调用Stuboperations方法,而Stub响应operations方法并完成后,再调用Runtimecallback方法进行返回。
上面说的可能太绕,下图为HAL Stub结构,我们继续来说明HALStub结构。
Android中 的HAL层简析
    上层通过HAL提供的functions来调用底层硬件,而底层硬件处理完成上层请求后或者硬件状态发生变化后,HAL层通过Runtime提供的callback接口回调上层应用。
    HAL里包含了很多的StubRuntime只要说明请求的类型,就可以取得并操作Stub对应的operations。其实现主要在hardware.chardware.h文件中,实质也是通过dlopen方法加载.so动态链接库,从而呼叫*.so里的符号(symbol)来实现的。