• 硬件抽象层


      HAL是建立在Linux驱动之上的一套程序。这套程序库并不属于Linux内核,而是属于Linux内核层之上的应用层。增加HAL的主要目的除了尽量避免应用程序直接访问Linux驱动外,还有一个重要原因,就是保护“私人财产”。那么它又是怎么保护的呢?

      HAL所在的位置是Android的系统运行库层,在应用框架层和Linux内核层之间,而Android采用了Apache Licence2.0协议发布,Apache Licence2.0协议并未要求使用基于Apache Licence2.0协议的源代码的软件也必须开源。由于HAL属于Android的一部分,自然也不必开源了。当然加入HAL还有其他目的:统一硬件的调用接口;针对一些特殊的要求。

      HAL的架构由最开始到现在有了很大的变化,原始的架构暂且不说,新版本的Android系统将HAL架构修改成了如图所示样子。

          

      从上图可以看出,调用HAL模块的代码并不需要直接装载.so文件,而只需通过一个ID来定位相应的.so文件。

      AndroidHAL的源代码存储的位置并不固定,一般会存储在Android源代码目录/hardware目录中,其中Android源代码目录/hardware/libhardware_legacy目录用来存储臼HAL架构的源代码文件。新HAL架构的源代码在Android源代码目录/hardwarelibhardware目录中。当然也可以放在Android源代码目录/hardware或其他目录中。最终编译生成的.so文件主要放在Android系统的/system/lib/hw目录,同样可以放其他目录。

      通过上面的介绍对HAL已经有了大概的了解,那么该怎么编写一款支持HAL的Linux驱动程序呢?

      1、编写Linux驱动,如果要为Linux驱动添加HAL,而且想尽量保护敏感数据,Linux驱动的代码要尽量简洁,尽可能将业务逻辑放到HAL Library中。

      2、编写HAL Library,这其实就是普通的Linux Library文件,但这类库文件有一个接口。通过HAL_MODULE_INFO_SYM变量实现。Service Library就是通过在这个接口中定义的ID定位HAL Libary的。

      3、编写Service Library,这一步其实并不是必须的,但是心的HAL架构要求我们这样做。Service Library也是Linxu Library。这一步比较灵活。Service Library可以是一般的Linux Library,也可以是JNI Library。

      以上就是一个支持HAL的Linux驱动程序编写的步骤。

  • 相关阅读:
    保证在浏览器上word/图片/Excel的下载的表现形式一样
    C学习笔记 知识集锦(二)
    函数返回值
    C++ 四种新式类型转换
    构造&析构
    指针与引用
    C++三大特性 封装 继承 多态
    Git stash 常见用法
    Git branch && Git checkout常见用法
    linux Vi使用
  • 原文地址:https://www.cnblogs.com/ww3344/p/5616983.html
Copyright © 2020-2023  润新知