Android底层开发技术实战详解——内核、移植和驱动

所需积分/C币:10 2014-05-07 11:48:52 820KB PDF

Android底层开发技术实战详解——内核、移植和驱动
互动出版网 www.china-pub.com China-Pub. com 专业图书网上第一专营店 独家提供样章 第3章驱动需要移植 W图乐 系统开发的一个比较典型的示例就是当系统需要某种功能时,为了给层次的应 用程序提供调用的接口,需要从底层到上层的整体开发,具体步骤如下所示 tφp凵增加或者和本地库 p2定义层所需要的类(系统 teP引将所需要的代码封装成 tep4结合类和 5cp5应用程序调用类 定要慎重对待对 系统的改动工作,因为系统的稍微变动就可能会涉及 应用程序的兼容问题。 系统本身的功能也处于增加和完善的过程中,因此 系统的开发也是一个重 要的方面。这种类型的开发涉及 软件系统的各个层次。在更多的时候, 系统开 发只是在不改变系统的情况下修正系统的缺陷,增加系统的稳定性。 从商业模式的角度来看,第一种类型的开发和第二种类型的开发是 开发的主流。事 实上,移动电话的制造者主要进行第一种类型的开发,产品是 实体手机;公司、个人和 团体都可以进行第二种类型的开发,其产品是不同的 应用程序。 在 的开发过程中,每一种类型的开发都只涉及整个 系统的一个子集。在 系统中有着众多开发点,这些开发点相互独立,又有内在联系。在开发的过程中,需要 重点掌握目前开发点涉及的部分 背景说明: 的接口是用语言编写的,通常更改接口函数的格式(参数、返回值)、 常量的值等内容就相当于更改系统 是一个开放的系统,适用于从最低端直到最高端的智能手机。核心的 在每部手机上都可使用,但仍然有一些接口有一些特别的适用范围:这就是 所谓的“可选” 在为某手机编写 应用程序时,需要多少地对 进行修改,然后实现 我们需要的功能。例如使用 添加蓝牙程序和 程序。在更改 时,通常更改其接口函数的格式(参数、返回值)和常量值等内容。但是 毕竟是谷歌推出的一系列标准,为了方便以后系统的升级,建议大家不改变 的格式,而是只改变 的具体行为,也就是说为这些固定的 编写各种各样的应用程序 3.2 Android移植 本书讲解的是 驱动方面的开发知识,由图可知,驱动开发是底层的应用,属于 内核层的工作。因为驱动是系统和硬件之间的载体,涉及不同硬件的应用问题,所以需要 做系统移植工作。本节将简要介绍系统移植方面的有关问题 互动出版网 www.china-pub.com China-Pub. com 专业图书网上第一专营店 独家提供样章 Android底层开发技术实战详解—内核、移植和驱动 移植的任务 移植开发的最终目的是开发手机产品。从开发者的角度来看,这种类型的开发以具 有硬件系统为前提,在硬件系统的基础上构建 软件系统。这种类型的开发工作在 系统的底层。在软件系统方面,主要的工作集中在以下两个方面 (1) Linux中的相关设备驱动程序 驱动程序是硬件和上层软件的接口。在 手机系统中,需要基本的屏幕、触摸屏、键 盘等驱动程序,以及音频、摄像头、电话的 、蓝牙等多种设备驱动程序 (2) Android本地框架中的硬件抽象层 在 中硬件抽象层工作在用户空间,介于驱动程序和 系统之间 系统 对硬件抽象层通常都有标准的接口定义,在开发过程中,实现这些接口也就给 系统提供 了硬件抽象层。 上述两个部分综合起来相互结合,共同完成了 系统的软件移植。移植成功与否取决 于驱动程序的品质和对 硬件抽象层接口的理解程度 移植开发的工作由核心库 虚拟机、硬件抽象层 内核层和硬件系统协同完成,具体结构如图所示。 核心库 虚拟机 硬件抽象层 内核层(各种驱动) 硬件系统 移植 图 移植结构 移植的内容 在 系统中,在移植过程中主要移植驱动方面的内容。 移植主要分为如下几 个类型。 基本图形用户界面部分:包括显示部分、用户输入部分和硬件相关的加速部分,还 包括媒体编解码和 音视频输入输出部分:包括音频、视频输出和摄像头等。 ·连接部分:包括无线局域网、蓝牙 等 电话部分:包括通话 附属部件:包括传感器、背光、振动器等 具体来说主要移植下面的内容。 显示部分:包括 驱动和 模块 用户输入部分:包括 驱动和 多媒体编解码:包括硬件 驱动和 插件,例如 (加速器)部分:包括硬件 驱动和 插件。 互动出版网 www.china-pub.com China-Pub. com 专业图书网上第一专营店 独家提供样章 第3章驱动需要移植 音频部分:包括 驱动和 硬件抽象层。 视频输出部分:包括视频显示驱动和 硬件抽象层 摄像头部分:包括 驱动(通常是)和 硬件抽象层。 电话部分:包括 驱动程序和库 全球定位系统部分:包括驱动(例如串口)和硬件抽象层。 无线局域网部分:包括驱动和协议和的适配层 蓝牙部分:包括驱动和协议及的适配层 传感器部分:包括 驱动和 硬件抽象层 振动器部分:包括 驱动和 硬件抽象层。 背光部分:包括驱动和 硬件抽象层。 警告器部分:包括 驱动和系统和用户空间调用。 电池部分:包括电池部分驱动和电池的硬件抽象层 注意:在 系统中有很多组件,但并不是毎一个组件都需要移植,例如那些纯软的组件就 不需要移植。像浏览器引擎虽然需要下层的网络支持,但是实际上并不需要直接为其移植 网络接口,而是通过无线局域网或者电话系统数据连接来完成标准的网络接口 驱动开发的任务 前面介绍了 系统的基本知识和移植内容,那么究竞在驱动开发领域需要做什么工作 呢?我们的任务就是为某一个将要在 系统上使用的硬件开发一个驱动程序。因为 是基于的,所以开发 驱动其实就是开发 驱动。 对于大部分子系统来说,硬件抽象层和驱动程序都需要根据实际系统的情况来实现,例如传 感器部分、音频部分、视频部分、摄像头部分和电话部分。另外也有一些子系统的硬件抽象层是 标准的,只需实现内核中的驱动程序即可,例如输入部分、振动器部分、无线局域网部分 和蓝牙部分等。对于有标准的硬件抽象层的系统,有的时候通常也需要做一些配置工作。 随着 系统的更新和发展,它已经不仅仅是一个移动设备的平台,也可以用于消费类 电子和智能家电,例如以后的版本主要是针对平板电脑的,另外电子书、数字电视、机顶盒、 固定电话等都逐渐使用 系统。在这些平台上,通常需要实现比移动设备更少的部件。 般来说,包括显示和用户输入的基本用户界面部分是需要移植的,其他部分是可选的。例如电话 系统、振动器、背光、传感器等一般不需要在非移动设备系统上实现,一·些圊定位置设备通常不 需要实现系统。 33 Android对 Linux的改造 内核是基于 内核的,这是一个增强内核版木,除了修改部分外,还提 供了用于支持 平台的设备驱动。 不但使用了内核的基本功能,而且对 进行了改造,目的是实现更为强大的通信功能 互动出版网 www.china-pub.com China-Pub. com 专业图书网上第一专营店 独家提供样章 Android底层开发技术实战详解—内核、移植和驱动 对 内核文件的改动 在本书第章的内容中已经讲解过 内核的基本知识,其实 对 内核也进 行了改动,这些改动保存在下面的文件中。 drivers/misc/kernel debugger. C drivers/misc/pmem. C drivers/misc/gemutrace/qemu trace sysfs. C drivers/misc/qemutrace/qemu trace C drivers/misc/qemutrace /qemu traceh drivers/misc/uid stat drivers/staging/android/lowmemorykiller C drivers/staging/android/logger drivers/staging/android/timed output.h drivers/staging/android/ram console.c drivers/staging/android/timed gpio. C drivers/staging/android/logger. h drivers/staging/android/binder.h drivers/staging/android/binder. C drivers/staging/android/timed output.c drivers/staging/android/timed gpio.h drivers/rtc/alarm.c drivers/rtc/rtc-goldfish C drivers/net/pppolac C drivers/net/ppp mppe. C drivers/net/pppopnsc drivers/video/goldfishfb C drivers/switch/switch class C drivers/switch/switch gpio.C drivers/char/dcc tty. C drivers/char/goldfish tty. C drivers/watchdog /i6300esb c drivers/input/misc/gpio event. c drivers/input/misc/gpio input.c drivers/input/misc/gpio output. C drivers/input/misc/keychord c drivers/input/misc/gpio axisC drivers/input/misc/gpio matrix C drivers/input/keyreset C drivers/input/keyboard/goldfish events. C drivers/input/touchscreen/synaptics i2c rmi. C drivers/usb/gadget/android.c drivers/usb/gadget/f adb.h drivers/usb/gadget/f mass storage.h drivers/usb/gadget/f adb.c drivers/usb/gadget/f mass storage. C 互动出版网 www.china-pub.com China-Pub. com 专业图书网上第一专营店 独家提供样章 第3章驱动需要移植 drivers/mmc/host/goldfish.C drivers/power/goldfish battery C drivers/leds/ledtrig-sleepc drivers/mtd/devices/goldfish nand reg. h drivers/mtd/devices/goldfish nand.C kernel/power/earlysuspend c kernel/power/consoleearlysuspendc kernel/power/fbearlysuspend C kernel/power/wakelock.C kernel/power/userwakelockC kernel/cpuset. c kernel/cgroup debug. C kernel/cgroup. c /ashe include/linux/ashmem h include/linux/switch. h include/linux/keychordh include/linux/earlysuspend h include/linux/android aid.h include/linux/uid stat h include/linux/if pppolach include/linux/usb/android. h include/linux/wifi tiwlan h nclude/linux/android alarm. h include/linux/keyreset h nclude/linux/synaptics i2c rmi.h include/linux/android pmem. h nclude/linux/kernel debugger. h include/linux/gpio event.h nclude/linux/wakelock. h include/linux/if pppopnsh net/ipv4/sysfs net ipv4.c net/ipv4/af inet. C net/ipv6/af inet 6.C net/bluetooth/af bluetooth. c security/commoncap C fs/proc/base.C 为 构建 的操作系统 如果我们以一个原始的操作系统为基础,改造成一个适合于 的系统,所要做 的工作其实非常简单,仅仅是增加适用于 的驱动程序。在 中有很多 系统 的驱动程序,将这些驱动程序移植到新系统的步骤非常简单,具体来说有以下三个步骤 tep编写新的源代码 2在 配置文件中增加新内容。 互动出版网 www.china-pub.com China-Pub. com 专业图书网上第一专营店 独家提供样章 Android底层开发技术实战详解—内核、移植和驱动 tep3在 中增加新内容。 在 系统中,通常会使用 驱动 驱动 驱动、 动、蓝牙驱动和串口等驱动程序。并且还需要音频、视频、传感器等驱动和接口。移植的 过程就是移植上述驱动的过程,我们的工作是在 下开发适用于 的驱动程序,并移 植到 系统 在 中添加扩展驱动程序的基本步骤如下所示。 p在 内核中移植硬件驱动程序,实现系统调用接口。 tep2在中把硬件驱动程序的调用封装成 tep3]为上层应用的服务实现木地库,由 虚拟机调用本地库来完成上层代码的实现 tφp编写 应用程序,提供 应用服务和用户操作界面。 34内核空间和用户空间接口是一个媒介 驱动程序是供系统使用硬件的,也就是说,驱动程序是介于系统和硬件之间的桥梁。在 下开发这些中间桥梁的驱动程序时,需要用到内核空间和用户空间之间的接口 内核空间和用户空间的相互作用 现在,越来越多的应用程序需要编写内核级和用户级的程序来一起完成具体的任务。通常采 用以下模式:首先,编写内核服务程序利用内核空间提供的权限和服务来接收、处理和缓存数据; 然后,编写用户程序和先前完成的内核服务程序进行交互。具体来说,可以利用用户程序来配置 内核服务程序的参数,提取内核服务程序提供的数据,当然也可以向内核服务程序输入待处理数 据 比较典型的应用包括 (内核服务程序:防火墙) (用户级程序:规则设置 程序) (内核服务程序: 协议部分) (用户级程序: 密钥协商处理) 当然还包括大量的设备驱动程序及相应的应用软件。这些应用都是由内核级和用户级程序通过相 互交换信息来一起完成特定任务的。 系统和硬件之间的交互 实现硬件和系统的交互是底层开发的主要任务之一。在 平台下有如下种实现此功能 的方式。 1.编写自己的系统调用 系统调用是用户级程序访问内核最基本的方法。目前大致提供了二百多个标准的系统 调用(具体请参考内核代码树中的“ 和 ”文件), 并且允许我们添加自己的系统调用来实现和内核的信息交换。假如我们想建立一个系统调用日志 系统,将所有的系统调用动作记录下来,以便进行入侵检测,此时可以编写一个内核服务程序, 该程序负责收集所有的系统调用请求,并将这些调用信息记录到在内核中自建的缓冲里。我们无 互动出版网 www.china-pub.com China-Pub. com 专业图书网上第一专营店 独家提供样章 第3章驱动需要移植 法在内核里实现复杂的入侵检测程序,因此必须将该缓冲里的记录提取到用户空间。最直截了当 的方法是自己编写一个新系统调用实现这种提取缓冲数据的功能。当内核服务程序和新系统调用 都实现后,就可以在用户空间里编写用户程序执行入侵检测任务了,入侵检测程序可以定时、轮 询或在需要的时候调用新系统调用从内核提取数据,然后进行入侵检测。 2.编写驱动程序 的一个特点就是把所有的东西都看做文件( )。系统定义了简 洁完善的驱动程序界面,客户程序可以用统一的方法通过这个界面和内核驱动程序交互。而大部 分系统的使用者和开发者已经非常熟悉这种界面及相应的开发流程了。 驱动程序运行于内核空间,用户空间的应用程序通过文件系统中“”目录下的一个文件 来和它交互。这就是我们熟悉的文件操作流程: 注意:并不是所有的内核驱动程序都是这个界面,网络驱动程序和各种协议栈的使用就不大一致, 比如套接口编程虽然也有 等概念,但它的内核实现及外部使用方式都和普 通驱动程序有很大差异 这里先不谈设备驱动程序在内核中要做的中断响应、设备管理、数据处理等工作,在此先把 注意力集中在它与用户级程序交互这一部分。操作系统为此定义了一种统一的交互界面,就是前 面所说的 和等。每个驱动程序按照自己的需要做独立实现, 把自己提供的功能和服务隐藏在这个统一界面下。客户级程序选择需要的驱动程序或服务(其实 就是选择“”目录下的文件),按照上述界面和文件操作流程,就可以跟内核中的驱动交互 了。用面向对象的概念更容易解释,系统定义了一个抽象的界面( ),每个具体 的驱动程序都是这个界面的实现( 由此可见,驱动程序也是用户空间和内核信息交互的重要方式之一。从本质上来说, 和也是通过系统调用去完成的,只是这些调用已被内核进行了标准封装和统一定义 因此用户不必像填加新系统调用那样必须修改内核代码,重新编译新内核,使用虚拟设备只需要 通过模块方法将新的虚拟设备安装到内核中( 上)就能方便使用 大致可以将 中的设备分为如下三类。 字符设备:包括那些必须以顺序方式,像字节流一样被访问的设备 块设备:指那些可以用随机方式,以整块数据为单位来访问的设备,如硬盘等, ·网络接口:通常指网卡和协议栈等复杂的网络输入输出服务。 如果将我们的系统调用日志系统用字符型驱动程序的方式实现,整个过程就非常简单了。可 以将内核中收集和记录信息的那一部分编写成一个字符设备驱动程序。虽然没有实际对应的物理 设备,但是 的设备驱动程序本来就是一个软件抽象,它可以结合硬件提供服务,也完全可 以作为纯软件提供服务。在驱动程序中,可以使用 来启动服务,用 返回处理好的记 录,用设置记录格式等,用停止服务, 没有用到,那么我们可以不去实现它 然后在“”目录下建立一个设备文件,对应我们新加入内核的系统调用日志系统驱动程序 3.使用proc文件系统 是提供的一种特殊的文件系统,使用它的目的就是提供一种便捷的用户和内核间 互动出版网 www.china-pub.com China-Pub. com 专业图书网上第一专营店 独家提供样章 Android底层开发技术实战详解—内核、移植和驱动 的交互方式。以文件系统作为使用界面,使应用程序可以以文件操作的方式安全、方便地获 取系统当前运行的状态和其他一些内核数据信息 文件系统多用于监视、管理和调试系统,平常使用的和等管理工具就是利用 来读取内核信息的。除了读取内核信息外,文件系统还提供了写入功能,所以我们可以利用 它来向内核输入信息。比如通过修改文件系统下的系统参数配置文件“ ”,可以直 接在运行时动态更改内核参数 除了系统已经提供的文件条目,通过为我们留的接口,允许在内核中创建新的条目从而 与用户程序共享信息数据。比如可以为系统调用日志程序(无论是作为驱动程序还是作为单纯的 内核模块)在文件系统中创建新的文件条目,在此条目中显示系统调用的使用次数,每个单 独系统调用的使用频率等。也可以增加另外的条目用于设置日志记录规则。 4.使用虚拟文件系统(VFS) 很多内核开发者认为利用系统调用往往会使得系统调用意义不明确,而且难控制。而 将信息放入到文件系统中会使信息组织混乱,所以不赞成过多地使用此系统。他们的建议是 实现一种孤立的虚拟文件系统来代替和。这是因为文件系统接口清楚,而且便于用户 空间访问,同时利用虚拟文件系统使得利用脚本执行系统管理任务更加方便、有效。 下面举例来说如何通过虚拟文件系统修改内核信息。假设我们可以实现一个名为“” 的虚拟文件系统,其中文件对应内核存储的系统调用日志。此时就可以通过文件访问的普遍 方法获得日志信息,命令如下所示 cat /sagas/log 使用虚拟文件系统可以更加方便、清晰地实现信息交互。但是很多程序员认为的 接口十分复杂。其实读者无须担心,因为从 内核开始就提供了一种叫做的例子程 序,它可以帮助不熟悉文件系统的用户封装实现了的通用操作 5.使用内存映像 通过内存映像机制来提供用户程序对内存直接访问的能力。内存映像的意思是把内核 中特定部分的内存空间映射到用户级程序的内存空间去。也就是说,用户空间和内核空间共享 块相同的内存。这样做有如下影响。 内核在这块地址内存储变更的任何数据,用户可以立即发现和使用,根本无须进行数据复制。 在使用系统调用交互信息时,在整个操作过程中必须有一步数据复制的工作,或者是把内核 数据复制到用户缓冲区,或者是把用户数据复制到内核缓冲区。这样对于许多数据传输量大、时 间要求高的应用来说很不科学,因为许多应用根本就无法忍受数据复制所耗费的时间和资源。 使用 实现内核到用户空间的数据传输 是一种从内核到用户空间的高效数据传输技术。通过用户定义的通道,内 核空间的程序能够高效、可靠、便捷地将数据传输到用户空间 特别适用于内核空间有大 量数据需要传输到用户空间的情形,目前已经广泛应用在内核调试工具如

...展开详情

评论 下载该资源后可以进行评论 1

半点伤 只有一章呢
2014-05-14
回复
img
dgwdavids12

关注 私信 TA的资源

上传资源赚积分,得勋章
    最新推荐