zoukankan      html  css  js  c++  java
  • Android探索与驱动开发学与思(1)

    Android系统架构:嵌入式操作系统有4层
    1.Linux内核层:Android操作系统是基于Linux内核的,少有些差异与其他Linux系统,如Ubuntu。Linux驱动程序以及内存管理、进程管理、电源管理等程序共同组成Linux内核。内核版本为Linux2.6,不同版本的Android使用的Linux内核版本不同,有对应关系,不同版本的驱动可能并不通用
    2.C/C++编写的代码库层:Linux程序库 .so文件
    3.Android SDK API层用Java编写的,Java编写的各种library-基于Dalvik虚拟机格式
    4.应用程序层:Android用户 程序员和非程序员都要接触 Android UI,主要靠第三层来完成各种功能
    Android系统移植分为两部分:应用移植和系统移植。Android系统移植的主要工作这一部分相关具体内容已发布为博客,这里就不再赘述。
    Linux内核是移植的重点,Linux内核主要维护3个版本:Linux2.4、Linux2.6、Linux 3.x,大多数Linux系统都使用这些内核,最广泛的是2.6内核版本。若要查看android系统所采用的Linux内核版本,如果是手机设备上,打开设定,关于手机的信息里就有。如果是查看其它Linux系统的内核版本,有两种方法:①使用uname命令查看内核版本 在Linux终端输入命令:uname -a,uname是从/proc/version文件中获取信息,-a表示可以获取更多的信息,不然只显示当前的系统名或只输出Linux②查看proc/version文件获取内核版本,直接查看文件获取信息。输入命令:cat /proc/version, /proc不是普通的文件系统,而是系统内核的映像,该目录中的文件是存放在系统内存中的,它以文件系统的方式为访问系统内核数据的操作提供接口。
    Linux内核版本号的定义有一定的规则。Linux内核版本号的组成:主版本号+次版本号+修订版本号+微调版本号+为特定的Linux系统特别调校的描述,如内核版本为:2.6.29.7-flykernel-12a,2是主版本号,6是次版本号,29是修订版本号,7是对2.6.29的微调,即微调版本号,flykernel-12a是该Linux内核专门为flykernel调校,调校描述可以是任意字符串,由开发者自行定义。主版本号和次版本号组成一个Linux内核版本的系列,2.6.0表示2.6系列Linux内核。可通过网站http://www.kernel.org查看Linux内核版本信息。
    Linux内核版本会更新,每一次内核的变化就是Linux驱动的变化,即使驱动代码不进行修改,也需要在新的Linux内核版本下重新编译才可运行。任何版本的Linux内核,开发驱动的方法和步骤基本相同。
    学习Linux驱动还必须掌握的技术有GNU C,它是对标准C的扩展,Linux/UNIX下最常用的C语言编译环境,还需掌握一些与驱动相关的硬件知识。要准备一个自己熟悉的Linux操作系统,用来开发和测试Linux驱动,如Ubuntu;准备一个开发板,基于ARM11的三星S3C6410。开发完成驱动程序后,需在支持android的开发板上测试驱动程序是否能正确运行。更多的是要自己进行实践,才能发现问题解决问题,更好更快的熟练掌握驱动的开发与测试。
    Linux设备驱动是指设备驱动与硬件设备进行交互。计算机系统能够正常运行是软硬件共同作用的结果,没有硬件,软件就是空中楼阁不能用,没有软件,硬件就是一堆废铁。计算机软件初期并没有驱动,应用程序与硬件直接通信,他们之间的耦合度过高,应用软件程序员就必须了解外部设备与计算机之间的通信协议以及一些硬件的知识才能使应用程序与这些设备通信。为了解决这类问题,降低软件和硬件的耦合度,可以通过接口对类进行抽象,抽象度越高,耦合度越低。将同一类型不同具体对象抽象成统一的接口,抽象硬件的任务就落到了驱动身上。驱动是直接和硬件交互的一类程序,对硬件进行抽象。实例为应用程序访问打印机。为了解决接口问题,就要进行驱动程序的开发,用驱动来进行抽象成接口。
    Linux将存储器和外设分为3大类:字符设备、块设备和网络设备。字符设备是指必须以串行顺序依次进行访问的设备,如鼠标、键盘。块设备可以用任意顺序进行访问,以块为单位进行操作,如硬盘、软驱。字符设备不经过系统的快速缓冲,而块设备经过系统的快速缓冲,但他们之间没有明显的界限,Flash符合块设备的特点,但可把他作为字符设备来访问。字符设备和块设备的驱动设计有很大差异,对用户来说,他们都使用文件系统(Linux通过文件系统访问驱动)的操作接口open、close、read、write等函数进行访问。通过接口访问文件系统进而访问驱动。网络设备进行数据包的接收和发送,不对应文件系统的节点,Linux内核与网络设备的通信和Linux内核与字符设备、块设备的通信方式完全不同。书上有一个实例--LED驱动,控制开发板上4个LED,属于字符设备驱动。 任何的Linux驱动都有一个装载函数(装载驱动时调用)module_init和一个卸载函数(卸载驱动时调用)module_exit。
    Linux驱动编程只与Linux内核有关,与哪种Linux系统无关,即不管是哪个Linux系统,只要使用了相同的Linux内核,驱动就是通用的。通过Linux内核版本号判断Linux内核是否相同,即组成内核版本号的五部分完全相同,内核才是相同的。android开发的实质就是Linux驱动的开发,android的话又增加一个HAL,这是android特有的,android驱动都会有对应的HAL但它不是必需的,中介也可以是NDK。

  • 相关阅读:
    First Missing Positive
    Find Minimum in Rotated Sorted Array II
    switch两种写法对比
    常用的前端JavaScript方法封装
    如何保证缓存和数据库的一致性?
    14个前端小知识
    dataTable转换特定的类
    C# MD5 32大写位加密 UTF-8编码
    另一个 SqlParameterCollection 中已包含 SqlParameter
    C#实现数据回滚,A事件和B事件同时执行,其中任何一个事件执行失败,都会返回失败
  • 原文地址:https://www.cnblogs.com/wstone/p/5442081.html
Copyright © 2011-2022 走看看