略谈android体系结构---------硬件抽象层

来源:互联网 发布:淘宝怎么查买家退货率 编辑:程序博客网 时间:2024/06/06 09:09

学习老罗的《android系统源代码情景分析》

出身自linux的android系统,在对硬件的支持,以及上层对硬件的访问方式,做出了较大的改变。如下是android的体系结构,它的实现和使用依次涉及android系统的硬件驱动模型、硬件抽象层、外部库和运行时库、应用程序框架层和应用程序层。


android的硬件抽象层(HAL)运行在用户空间,详细屏蔽硬件驱动模块的实现细节,向上提供硬件访问服务。通过硬件抽象层,android分两层来支持硬件设备,其中一层实现在用户空间,它以硬件抽象层模块的形式来支持,封装了硬件的实现细节和参数;另一层在内核空间,它以硬件驱动模块的形式来支持,不过它只提供简单的硬件访问通道。

下面构造一个虚拟的字符硬件设备,首先在android系统的内核空间为它开发硬件驱动程序,接着在用户空间中为该硬件添加一个硬件抽象层模块,并且在应用程序框架层添加一个硬件访问服务,最后开发一个应用程序来访问该硬件服务。


1.开发android硬件驱动

此例为一个虚拟的字符硬件设备开发驱动程序。该设备只有一个寄存器,大小为4字节,可读可写。方法与linux无异。在此称这个字符设备为freg。

freg驱动向用户空间提供了三个接口来访问虚拟硬件射给freg的寄存器val。第一个是proc文件系统接口,第二个是传统的设备文件系统接口,第三个是devfs文件系统接口。devfs接口将freg的寄存器val仿作设备的一个属性,通过读写这个属性就可以达到访问设备的目的。

具体代码详见老罗的《android系统源代码情景分析》。

验证该驱动: 1.检查/dev目录下是否存在设备文件freg,如果有,则说明freg驱动成功注册到设备文件系统了;

2.检测proc文件系统接口:进入/proc目录,使用cat命令读取freg内容,再使用echo命令吸入新内容,再用cat读出;3.检测devfs文件系统接口:进入/sys/class/freg/freg中,使用cat和echo命令测试;3.检测dev文件系统接口:开发c可执行程序,以读写文件的方式来访问freg。


2.开发android硬件抽象层模块

android系统为硬件抽象层模块定义了编写规范,每一个硬件抽象层模块都对应有一个动态链接库文件,,这些动态链接库文件的命名需要符合一定的规范。android系统的硬件抽象层模块式由系统统一加载的,调用者只需要指定他们的ID 就可以了。

硬件设备的访问权限:默认情况下,只有root用户才有权限访问系统的设备文件。为了让其他用户可以访问/dev/freg,在linux中我们可以通过udev规则在系统启动时修改设备文件的访问权限,android提供的则是uevent机制。在/system/core/rootdir目录下有一个配置文件uevent.rc,可以在里面添加一行来修改设备文件/dev/freg的访问权限                /dev/freg 0666root root


3.开发android硬件访问服务

开发好硬件抽象层模块后,还需要在应用程序框架成中实现一个硬件访问服务。硬件访问服务通过硬件抽象层来为应用程序提供硬件读写操作。硬件访问服务必须通过JNI来调用硬件抽象层模块的接口。

android系统的硬件访问服务运行在系统进程system中,而使用这些硬件访问服务的应用程序一运行在另外的进程中,通过binder进程间通信机制,应用程序句可以访问运行在system进程中的硬件了。binder进程间通信机制要求提供服务的一方实现一个具有跨进程访问能力的服务接口,为此需要先定义服务接口。

android使用AIDL定义具有跨进程访问能力的服务接口。它以aidl为后缀名,编译时会转换为java文件。

android的硬件访问服务通常是在system进程中启动的,而system进程是由zygote进程负责启动的。为此我们需要把硬件访问服务运行在system进程中,这样就可以开机启动。system进程启动时会创建一个serverthred线程来启动系统中的关键服务,其中就包括一些硬件访问服务。在serverthread类的成员函数中,首先创建一个fregservice实例,然后把它注册到service manager中。


4.开发android应用程序来使用硬件访问服务

通过service manager获得名称为“freg”的服务的binder代理对象接口,该服务对应于运行在系统进程system中的硬件访问服务fregservice,然后将这个binder对象接口转换为一个fregservice代理对象接口,这样应用程序就可以调用它的成员函数来访问虚拟硬件设备freg的寄存器val的值。














原创粉丝点击