分类: LINUX
2010-08-22 01:18:19
Android驱动Hal学习总结
下面是这段时间研究Android驱动程序框架的心得,要进行深一步的研究还得深入代码分析。
Android 的重点就是商业应用,Google采用了一些手法来绕过这问题。他们把驱动程序移到 "userspace",也就是说,把驱动程序变成在 Linux kernel 上头跑,而不是一起跑的东西,这样就可以避过GPL。然后,在 kernel 这边开个小门,让本来不能直接控制到硬件的 "userspace" 程序也可以碰得到,这样只要把"开个小门"的程序代码公布就可以符合GPL协议了。
这样又有一个问题,在android体系结构里面,Linux kernel是包含驱动的,和这个Hal又有什么区别呢? 这里,我是这样理解的,Linux kernel里面的驱动是通用驱动,是开源的,厂家把一些功能性的驱动都移到了HAL层里面。不知道这样理解对不对,求证~~
引入HAL这种方法的巧妙之处在于,Kernel和Android的许可证不一样,前者是GPL许可证,后者是Apache Software License(简称ASL)许可证。GPL许可证规定,对源码的任何修改都必须开源,所以Android开源了,因为它修改了Kernel。而ASL许可证规定,可以随意使用源码,不必开源,所以建筑在Android之上的硬件驱动和应用程序,都可以保持封闭。为了得到更多厂商的支持,Google有意选择了这样做,并且特意修改Kernel,使得原本应该包括在kernel中的某些功能,都被转移到了userspace之中,因此得以避开开源。
图1:hal层
对Hal的理解如上图1,其实这里的Hal层跟windows Hal层很相似,其目的是使得上层应用忽略底层的设备差异,从而使应用程序接口统一。只是这里的Hal层视乎比windows的Hal多完成了一些功能,很多属于更底层驱动的功能,现在被转移进来了。 Android中,HAL 模块主要以MODULE_ID.platform.so 的名字存放在文件系统的/system/lib/hw/ 目录下面.
图2:Hal Stub |
chinomango2010-11-02 09:14:58
其实没有HAL。Java当然不能操作硬件,于是要用JNI调用户空间的C++.这个C++就被叫成HAL,而实际上android app也这末用,不操作硬件也可以这么用。操作硬件的话它再调标准驱动程序。当然,这时驱动程序可以只剩一个几乎空的壳,但就不再能为别人用了。 其实也没有NDL。不过是个JNI的调用包装。JNI一直存在并可使用,不过是可以打包进apk。
chinaunix网友2010-08-26 17:55:22
Android对Linux的驱动并没有改变 HAL是对驱动调用的一种封装:实现上层需要的几个API函数而已 (也可以叫回调函数)