第九章 硬件抽象层:HAL
这一章介绍HAL,全称为Hardware Abstract Layer,即硬件抽象层,它是建立在Linux驱动之上的一套程序库,程序库并不属于Linux内核,而是属于Linux内核层之上的应用层。为Android增加HAL的目的除了尽量避免应用程序直接访问Linux驱动外,还会保护私人财产。
在Android中加入HAL的原因如下:
在传统的Linux系统中Linux驱动一般有两种类型的代码:访问硬件寄存器的代码和业务逻辑代码。对于访问硬件寄存器的代码,都是调用Linux内核的标准函数进行标准操作。而Linux驱动的业务逻辑部分开发人员并不想将源代码公开,这些Linux驱动的实现涉及一些技术专利和商业机密,公开会有麻烦。但作为Linux驱动,又不得不公开源代码,因为Linux内核采用了GPL协议,而此协议要求所有使用基于GPL协议的源代码的程序必须开源。为了满足不想开源的要求,Google在Android层次结构中的系统运行库层增加了一个HAL,HAL并不是Linux内核的一部分,它位于Android的系统运行库层,Android采用Apache license2.0协议,该协议并未要求基于此协议的源代码的软件也必须开源,HAL属于Android的一部分,不必开源。对于不想开源的Linux驱动作者,Linux驱动只相当于一个“数据二传”,在Linux驱动中只保留与寄存器交互的代码,访问寄存器只有Linux内核的相关函数能做到,不想公开的业务逻辑代码放在HAL中。这样的话,Linux驱动就只剩下一个空壳,唯一的功能就是接收由HAL传来的数据,并将这些数据写入指定的寄存器中,或从寄存器中读取数据,并返回给HAL。带HAL的Linux驱动相当于将数据从HAL传到寄存器,或从寄存器传到HAL的“数据二传”。对于拥有完整功能的Linux驱动,也可加入HAL,不过HAL就成一个空壳了,它只负责与Linux设备驱动进行交互。
Google为Android加入HAL主要目的有:①统一硬件的调用接口。由于HAL有标准的调用接口,可利用HAL屏蔽Linux驱动复杂、不统一的接口②解决了GPL版权问题。由于Linux内核基于GPL协议,而Android基于Apache license2.0协议,Google将原本位于Linux驱动中的敏感代码上移了一个层次,这些代码摆脱了GPL协议的束缚,不想开源的Linux驱动就没必要开源了③针对一些特殊的要求。对于有些硬件,可能需要访问一些用户空间的资源,或在内核空间不方便完成的工作及特殊要求,这种情况下,可利用位于用户空间的HAL代码来辅助Linux驱动完成一些工作。
起初简单的HAL架构基本原理是在Android系统中使用程序库.so文件调用位于内核空间的一半通过设备文件访问的Linux驱动。然后Android应用程序apk文件可通过NDK程序访问HAL中的程序库,或直接在Android应用程序中访问HAL中的程序库,可直接使用Java代码访问。HAL架构中,HAL模块中的核心代码没有改变,只是增加了一些新的HAL架构要求的入口代码,使这些程序库可自动被Android系统识别。而调用HAL模块的代码并不需要直接装载.so文件,只需要通过一个ID定位相应的.so文件-Stub。在Stub和JNI间还有一层service程序库,该层的库文件使用Android系统提供的调用HAL的机制访问HAL中的service程序库,在这层通过ID定位了HAL library,然后Android应用程序再调用service程序库。Android HAL的源代码存储位置并不固定,一般会存储在<Android源代码>/hardware目录中。最终生成的.so文件主要放在Android系统的/system/lib/hw目录。
第九章 硬件抽象层:HAL的更多相关文章
- 精通Web Analytics 2.0 (11) 第九章: 新兴分析—社交,移动和视频
精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第九章: 新兴分析-社交,移动和视频 网络在过去几年中发生了不可思议的发展变化:从单向对话到双向对话的转变; 由视频,Ajax和 ...
- 第九章:四大组件之Broadcast Receiver
第九章:四大组件之Broadcast Receiver 一.广播的功能和特征 广播的生命周期很短,经过调用对象-->实现onReceive-->结束,整个过程就结束了.从实现的复杂度和 ...
- [Effective Java]第九章 异常
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 第九章 C语言在嵌入式中的应用
上章回顾 编码的规范和程序版式 版权管理和申明 头文件结构和作用 程序命名 程序注释和代码布局规范 assert断言函数的应用 与0或NULL值的比较 内存的分配和释放细节,避免内存泄露 常量特性 g ...
- Laxcus大数据管理系统2.0(11)- 第九章 容错
第九章 容错 在当前,由于集群庞大的组织体系和复杂性,以及用户普遍要求低成本硬件,使得集群在运行过程中发生的错误概率,远远高于单一且性能稳定的小型机服务器,并且集群在运行过程中几乎是不允许停止的,这就 ...
- Android群英传》读书笔记 (4) 第八章 Activity和Activity调用栈分析 + 第九章 系统信息与安全机制 + 第十章 性能优化
第八章 Activity和Activity调用栈分析 1.Activity生命周期理解生命周期就是两张图:第一张图是回字型的生命周期图第二张图是金字塔型的生命周期图 注意点(1)从stopped状态重 ...
- [转]Windows Shell 编程 第九章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987969】
第九章 图标与Windows任务条 如果问一个非程序人员Windows最好的特色是什么,得到的答案应该是系统最有吸引力的图标.无论是Windows98现在支持的通用串行总线(USB)还是WDM(看上去 ...
- perl5 第九章 关联数组/哈希表
第九章 关联数组/哈希表 by flamephoenix 一.数组变量的限制二.定义三.访问关联数组的元素四.增加元素五.创建关联数组六.从数组变量复制到关联数组七.元素的增删八.列出数组的索引和值九 ...
- Android架构分析之使用自定义硬件抽象层(HAL)模块
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本:2.3.7_r1 Linux内核版本:android-goldfish-2.6.29 在上一篇博 ...
随机推荐
- springmvc的foward和redirect跳转简单解析
Spring MVC 中,我们在返回逻辑视图时,框架会通过 viewResolver 来解析得到具体的 View,然后向浏览器渲染.假设逻辑视图名为 hello,通过配置,我们 配置某个 ViewRe ...
- null
期末考备考最后三天. 加油,把这学期学的知识给它搞透了.
- httplib用法
httplib的内容上是很多,也比较简单.以下是一个非常简单的例子,使用httplib获取google首页的html: import httplib conn = httplib.HTTPConnec ...
- No package mysql-server available.
Centos 7 comes with MariaDB instead of MySQL. MariaDb is a open source equivalent to MySQL and can b ...
- 解读浮动闭合最佳方案:clearfix
.clear{clear:both;height:0;overflow:hidden;} 上诉办法是在需要清除浮动的地方加个div.clear或者br.clear,我们知道这样能解决基本清浮动问题. ...
- CSS样式应用
CSS样式应用的方法: (1)行内样式,将css样式直接放到标签当中,一般都是放入标签的style属性中,它是最方便的一种样式,也是最不方便修改的样式.如下: (2)内嵌式,通过将css写在网页源文件 ...
- Jquery mobile 新手问题总汇
1页面缩放显示问题 问题描述: 页面似乎被缩小了,屏幕太宽了. 解决办法: 在head标签内加入: <meta name="viewport" content="w ...
- 获取checkbox后面的文本内容
http://alygle.blog.51cto.com/1922399/669040 <head> <meta http-equiv="Content-Type" ...
- php crc32,md5,sha1,mhash测试结果
总结:php 自带hash mhash 用于散列只能加密 扩展mcrypt 用于加解密 对文件加密有的文件会隐藏换行,或者读取方式等影响导致结果不一致. 1.crc32 php: a.系统crc ...
- Linux下搭建DNS服务器
1. 安装需要的软件 由于实验过程是在自己电脑进行的,所以需要安装bind bind-chroot,以下为安装过程. 图1-1 安装bind 图1-2 安装bind-chroot 2.修改DNS主配置 ...