Android中HAL层与内核驱动之间的关系

首先,Android的HAL是为了一些硬件提供商提出的“保护proprietary”的驱动程序而产生的东东,简而言之,就是为了避开linux kernel的GPL license的束缚。Android把控制硬件的动做都放到了user space中,而再kernel driver里面只有最简单的读写寄存器的操做,而彻底去掉了各类功能性的操做(好比控制逻辑等),这些可以体现硬件特性的操做都放到了Android的HAL层,而Android是基于Aparch的license,所以硬件厂商能够只提供二进制代码,因此说Android只是一个开放的平台,并非一个开源的平台。

从网上看到的这样一段话,还存在的疑问是,1.既然“把控制硬件的动做都放到了user space中“,那kernel driver的做用是什么,
2.HAL层与内核驱动层之间是怎么交互的,他们之间的接口函数是什么呢?java

====================linux

内核里的设备驱动其实就是实现硬件的各类功能及调用接口, 至于怎么使用这硬件功能由应用程序的调用来决定的。

应用程序调用内核驱动的接口基本是统一的标准接口, 也就是所谓的系统调用接口。Android里的HAL层其实就是把调用内核驱动实现的功能封装成一个个的类,供java来调用函数

====================编码

针对寄存器和IO级别的操做只能在内核完成,由于这些操做须要读写一些应用层没法看到的地址。而其余的组合逻辑交给HAL层来完成,这样的话必须GPL的内核驱动代码只包含了最基础的操做,而真正的业务交给不开源的HAL来操做。好比说基于I2C的加密芯片驱动,你在内核驱动层只实现I2C读写,关于加密的逻辑和命令所有在HAL实现,在HAL中组织数据包,调用I2C驱动给出的接口实现功能。加密

====================spa

HAL层最终仍是要进行Linux系统调用打开设备文件,Android作了Java到C/C++的接口,记得是叫JNI层吧,按照Google定好的规则进行编码,就能够实现Java到系统调用之间的连接接口

相关文章
相关标签/搜索