最近读了一本《android 深度探索 卷1》下面介绍一些读书时的体会:
首先,通过阅读《HAL与驱动开发》了解了“移植”:为特定设备定制Android的过程,而在移植过程中开发最多的就是支持各种硬件设备的LINUX驱动程序,因此谈系统移植就必须谈驱动开发。
其次,需注意:1>android系统架构如下图:总共分为四层(由底层到上层)依次为:linux内核(主要包括驱动程序以及管理内存、进程、电源等资源的程序)本书主要讲的、C/C++代码库(主要包括linux的.so文件以及Dalivk虚拟机的运行时)、Android SDK API(直接面向应用程序的java APK)、应用程序(直接面向最终用户的java用户程序APK程序)。
2>android系统移植所包含的工作:其基本原则:尽可能的找到驱动和HAL源代码
注意:移植linux驱动时只需考虑linux内核的版本。
3>查看linux内核版本:
主要维护3个版本:linux2.6(广泛应用) linux2.4(很少应用,因进程调度上存在一定的缺陷) linux3.x(最新的系统采用了这个,例如:android4.x)
查看版本三个方法:1、查看当前系统所采用的linux内核:“设备”---->关于手机;2、查看其他系统的linux版本:1.在linux终端执行:uname -a;2.或者执行:cat /proc/version.两者的联系:uname就是从/proc/version文件中获取信息,-a代表获取更多的信息,否则只是系统名。结果如图:
4>内核版本号的定义规则:
主要组成:1.主版本号 2.次版本号 3.修订版本号 4.微调版本 5.为特定的linux系统特别调校的描述。例如:2.6.29.7-flykernel-12a中“2”主版本号,“6”次版本号(两者可以组成一个内核版本的系列),“29”修订版本号,“7”对2.6.29的微调版本号,后面的便是为flykernrl调校,调校字符可以是任意字符串,开发者自己定义。
5>那么如何学习驱动开发呢?
答:1>准备一个自己熟悉的操作系统,用于开发和测试linux驱动,例如red hat liunx;2>学习GUN C(对标准C的扩展及驱动开发的相关硬件知识)3>学习相关的硬件知识4>不断实践。
6>了解linux设备驱动:
1>作用:直接和硬件交互的一类程序负责对硬件进行描述
2>分类以及特点:linux将存储器和外设主要分为三大类:字符设备(串行顺序、依次访问例如:触摸屏、鼠标、键盘等)、块设备(以块为单位、任意顺序访问)、网络设备(面向数据包的接受和发送)
三者区别:字符设备不经过文件系统的缓冲,而块设备经过文件系统的快速缓冲,但是字符设备与块设备并没有明显的界限,如Flash。字符设备与块设备设计上存在很大的区别,但是对于用户而言,它们都是使用文件系统的操作接口open、close、read、write等函数进行访问。而网络设备并不对应文件系统节点。linux内核与网络设备通信与上述两种完全不同。
7>以LED灯为例见证一下什么叫linux驱动。;:
如果我们接触linux大学课程,会发现很多linux应用开发都会涉及led灯程序,其中的内核加载和内核卸载是最主要程序。装载:mobule_init,卸载:mobule_exit。
总结:
通过阅读第一章,以及上述的描述,我发现学习linux驱动开发一定要了解linux内核。不管用户使用的是哪个linux版本只要linux内核版本相同便可以使用驱动。而只有linux的五个组成全部相同,内核才相同。最重要的我了解到学习android驱动开发就相当于学习linux驱动开发。