Android HAL 分析
2010-05-26 06:40:00 来源:WEB开发网图3:Android HAL / libhardware
现在的 libhardware 作法,就有「stub」的味道了。HAL stub 是一种代理人(proxy)的概念,stub 虽然仍是以 *.so?的形式存在,但 HAL 已经将 *.so 档隐藏起来了。Stub 向 HAL「提供」操作函数(operations),而 runtime 则是向 HAL 取得特定模块(stub)的 operations,再 callback 这些操作函数。这种以 indirect function call 的实作架构,让HAL stub 变成是一种「包含」关系,即 HAL 里包含了许许多多的 stub(代理人)。Runtime 只要说明「类型」,即 module ID,就可以取得操作函数。对于目前的HAL,可以认为Android定义了HAL层结构框架,通过几个接口访问硬件从而统一了调用方式。
4 HAL_legacy和HAL的对比
HAL_legacy:旧式的HAL是一个模块,采用共享库形式,在编译时会调用到。由于采用function
call形式调用,因此可被多个进程使用,但会被mapping到多个进程空间中,造成浪费,同时需要考虑代码能否安全重入的问题(thread safe)。
HAL:新式的HAL采用HAL module和HAL stub结合形式,HAL stub不是一个share library,编译时上层只拥有访问HAL stub的函数指针,并不需要HAL stub。上层通过HAL module提供的统一接口获取并操作HAL stub,so文件只会被mapping到一个进程,也不存在重复mapping和重入问题。
5 HAL module架构
HAL moudle主要分为三个结构:
struct hw_module_t;
struct hw_module_methods_t;
struct hw_device_t;
他们的继承关系如下图:
图4:Android HAL结构继承关系
6 HAL使用方法
(1)Native code通过hw_get_module调用获取HAL stub:
hw_get_module (LED_HARDWARE_MODULE_ID, (const hw_module_t**)&module)
(2)通过继承hw_module_methods_t的callback来open设备:
module->methods->open(module,
LED_HARDWARE_MODULE_ID, (struct hw_device_t**)device);
(3)通过继承hw_device_t的callback来控制设备:
sLedDevice->set_on(sLedDevice, led);
更多精彩
赞助商链接