外面满天飞的文档一无例外的都在灌输这样的思想:Google通过HAL,把驱动放到了User Space中,从而使得设备厂商避免暴露驱动的源码
但是, 真正的设备驱动,肯定最终是需要和设备打交道的,必须处于Linux Kernel上, 根本不可能整个驱动完全运行在User Space上(当然,微内核中是可以的,不过Android上不可以)。  以Camera打比方:HAL层中有Camera相关的实现, 但是,Linux Kernel中还是存在Camera的Driver。 这样的例子很多,比如Audio,Video, GPS, Sensor等等, 几乎清一色的在HAL层中有实现, 在Linux Kernel中也有Driver的实现, 然后HAL层调用Kernel中的真正Driver。这样的话, Driver仍然是存在的,那干嘛还搞个HAL呀, HAL真正的目的是什么那?哪些大虾给小弟释疑一下谢谢啦~~~~

解决方案 »

  1.   

    看看android给的回复:
    Why do we need a user-space HAL?
    • Not all components have standardized kernel driver interfaces
    • Kernel drivers are GPL which exposes any proprietary IP
    • Android has specific requirements for hardware driversandroid这样搞,是想要上层有一个统一的调用方式,这个android自己定死了,雷打不动。
    问题是底层linux driver各家肯定也是不一样的,也不好让各个硬件厂商自己再为android专门写一个吧。
    这样要让雷打不动(因为已经release了)的android怎么适应下面善变的linux driver呢? 要知道android是开发来适应不同平台不同硬件厂商的,不像iphone。唯一的解决方法就是加一个适应层, 即hal,这层有vendor来实现,将自己的driver按照android的要求封装一下即可。 问题都解决了。
      

  2.   

    这里的kernel driver相对于linux真正的driver形式上是一样的,也提供open,read,write,ioctl,mmap等接口,但是,一般来说,只通过这些代码,你并不能了解到硬件的特性,比如write接口,就可以只作成往寄存器写操作,至于如何写,为什么要写,这些工作都会再HAL层进行,而一般用户是看不到这些代码的。这也是为什么linux mainstream把android的kernel踢出去的原因,因为这些driver根本无法用在其他的linux平台上
      

  3.   

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