一.Android系统架构
Android系统架构分为4层:
第一层:Linux内核
Android是基于Linux内核的,因此,Android内核和标准Linux2.6的内核结构基本相同,细微差异在Android在Linux内核中增加的主要是一些Android专用驱动和Android使用的设备驱动,这些驱动程序在Android不同版本中可能并不通用。
第二层:C/C++代码库
是使用C/C++编写的代码库也就是Linux下的.so文件,还有Android运行时环境(AndroidRuntime)。
第三层:应用程序框架(Android SDK API)
是用Java语言编写的各种Library(基于Dalvik虚拟机格式的)。
第四层:应用程序
这一层相当于Android的UI,所有的Android应用程序包括拍照,短信,浏览器及游戏等都属于这一层。这一层主要依靠第3层中的Android SDK API来完成各种功能。
二.Android系统移植
Android系统移植分为两部分:应用移植和系统移植。
应用移植是指应用程序移植到某一个特定的硬件平台上。一般Android应用程序移植并不涉及驱动和HAL程序库的移植。
系统移植是指让Android操作系统在某一个特定硬件平台上运行。使操作系统在特定硬件平台上运行需要该操作系统支持硬件平台的CPU架构。Linux内核支持很多常用的CPU架构,因此Android在不同的CPU架构之间移植不用过多改动。还需让Android可识别平上各种硬件。这是由Linux驱动完成的。Android还增加了HAL(硬件抽象层),通过其来访问驱动,这与其他Linux系统应用程序直接访问驱动不同。如果增加了新的驱动或修改了驱动代码,HAL中的代码也要做相应的调整。
注意:
Android移植很大是移植Linux内核。Android版本同Linux版本不同,无论哪个Android版本其内核都是基于Linux2.3或Linux3.0(将来会是更高版本),只是会根据需求修改添加驱动或其他。移植Linux驱动时,只要Linux内核相同,Android版本不同也可移植。
三.Linux内核版本号
查看Linux版本号,在Linux终端执行下面命令:
“uname -a”或“cat /proc/version”
Linux版本号定义规则:
主版本号+次版本号——>(Linux版本系列)
+修订版本号+微调版本号+为特定Linux系统调校的描述
四.学习Linux驱动要做的准备:
Linux操作系统,开发板,GNU C知识,相关硬件知识,还有不断实践(自省:不论学得多少,常去实践才能掌握,不可偷懒)。
Linux驱动的学习不止有Linux内核,还应有可搭载的开发环境,并可测试的环境。Google测试Android使用Ubuntu Linux,因此推荐使用Ubuntu Linux10.04以上版本的操作系统。
GNU C是标准C的扩展,是Linux下最常用的C语言编译环境。
五.Linux设备驱动:
设备驱动沟通软硬件且区分软硬件,使软件工程师与硬件工程师职责明确,不需要软硬兼顾。设备驱动同硬件直接交互抽象成接口,使应用软件可通过驱动在不同硬件设备自如切换,防止了硬件过度耦合的情况。
计算机系统的硬件主要由CPU,存储器和外设组成。驱动针对的对象是存储器和外设:字符设备,块设备,网络设备。
字符设备:必须以串行顺序依次进行访问的设备,实际的硬件I/O操作紧接着读/写请求发生。
块设备:可以以任意顺序进行访问的设备,读/写请求时利用系统内存作为缓存区。
网络设备:面向数据包的接收和发送而设计,并不对应于文件系统的节点访问。
六.总结:
任何Linux驱动都有一个装载函数(装载驱动时调用)和一个卸载函数(卸载函数时调用)。Linux内核相同,无论哪个Linux系统,驱动就可通用。判断Linux内核相同就是组成内核版本号的五部分完全相同。Android驱动开发就是Linux驱动开发和HAL(Android特有的)。