第九章 硬件抽象层: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 在上一篇博 ...
随机推荐
- IE下,js改变绝对定位的属性不生效
如果想要动态改变定位位置的值,例如改变TOP的值,IE下必须要给TOP一个初始值,不然不生效..
- ant 错误 Specified VM install not found: type Standard VM, name jdk1.6.0_27
ant 错误 ant Specified VM install not found: type Standard VM, name jdk1.6.0_27 原因: 安装了新的jdk, 在workspa ...
- MyBatis总结(一)
一.创建测试项目工程 二.导包(一个myBatis所需的包,以及一个数据库操作的包) 三.创建实体类 四.配置文件的建立(最佳命名为(SqlMapConfig.xml)) <?xml versi ...
- 安装pear
下载go-pear.phar php go-pear.phar pear install Mail-1.2.0 pear list
- php时间设置为本地
PHP Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to ...
- 30 天精通 Git 版本控管
https://github.com/doggy8088/Learn-Git-in-30-days
- PL/SQL设置快捷键
PL/SQL常用的快捷方式: sf= select * from sr=select t.*,t.rowid from t sd = select distinct * from d=delete f ...
- Entity Framework – (复数)Plural and (单数)Singular 表名Table names
By default, the Entity Framework will assume that all of the names of your tables in your database a ...
- 1476. Lunar Code
http://acm.timus.ru/problem.aspx?space=1&num=1476 由于前一列对后一列有影响,所以需要保持前一列的状态, 但无需用状态压缩来保存(也保存不了) ...
- c语言函数, 函数调用及函数递归
1. 函数的定义: 返回值类型 函数名(形参列表) {函数体(函数的实现内容)}, 注意: 如果没有参数, 小括号也是必不可少的. 函数与函数之间可以嵌套调用(也就是在一个函数内部可以调用另外一个函 ...