【Android源码 栏目提醒】:网学会员在Android源码 频道为大家收集整理了“Android系统架构及其驱动研究 - 企业软件开发“提供大家参考,希望对大家有所帮助!
2010 年第 4 期 总第 41 期 广州广播电视大学学报 Vol110 No142010 年 8 月 JOURNAL OF GUANGZHOU OPEN UN I ERSITY V Aug12010
Android系统架构及其驱动研究 胡 伟 广州大学华软软件学院 广东 广州 510990 要 摘 :
Android 作为 Google公司推出的专为智能终端定制的操作系统 已经成为目前智能手机中增长最快的操作系统 并且必将对手持终端操作系统的发展产生重要而深远的影响 。
文章研究 、分析了该操作系统的架构 、代码结构 并着重研究了其驱动的原理和特点 。
关键词 :
Android L inux 架构 驱动程序 中图分类号 : TP316 文献标识码 : A 文章编号 : 1672 - 0385 2010 04 - 0096 - 06 一 、引言 标准的 L inux 内 核 外
Android 系 统 还 增 加 了
Android 是 Google公司在 2007 年 11 月发布 B inder IPC 驱动 、W iFi 驱动 、蓝牙驱动等驱动的基于 L inux 系 统的 手机 系统 平 台 是 HTC、 程序 为系统运行提供了基础性支持 。
Motorola 等企业多款智能手机的操作系统 。
据世 第二 层 是 核 心 的 扩 展 类 库 如 SQL ite、界消费和零售市场研究领导者 NPD Grop 数据报 W ebKit、OpenGL 等 它们可以通过 JAVA 本地告显示 从今年第一季度开始
Android 已经取 调用 JN I Java Native Interface 的接口函数实代苹果的 iPhone 成为美国第二大智能手机操作 现和上层之间的通信 。
该层由
Android的 Java 虚系统和增长速度最快的智能手机操作系统 。
凭 拟机 Dalvik和基础的 Java 库为 Java 运行环境提借 Google 公司强劲的创新和开发能力以及其开 供了 Java 编程语言核心库的大多数功能 。
源和免费的特性 其必将是移动终端操作系统 第三层是包含所有开发所用的 SDK 类库和的一场革命 。
而国内目前研究和介绍该系统的 某些未公开接口类库的框架层 是整个
Android文章较少 本文着重介绍了该系统的系统架构 平台核心机制的体现 。
和驱动工作机理 。
第四层是应用层 。
系统部分应用和第三方 开发的应用都是位于这个层次上 但两者不完 二 、
Android系统架构 全相同 其中系统应用会用一些隐藏的类 而
Android 是为移动设备设计的软件平台 包 第三方的应用 是基于 SDK 基础上开发的 。
一括操作系统 、中间件和一些关键应用 。
Android 般
Android开发是在 SDK 基础上用 Java 编写应SDK提供了必须的工具和进行应用开发所必须 用程序 但本机开发程序包 NDK提供了应用层的 Java 接口 AP I。
穿越 Java 框架层直接和底层包含了 JN I接口的
Android 是一个开放的软件系统 为用户提 C /C 库直接通信的方法 。
供了丰富的移动设备开发功能 从下至上包括 4 其中第一层由 C 语言实现 第二层由 C 和个层次 如图 1 所示 。
其中第一层是 L inux内核 C 实现 第三 、四层主要由 Java 代码实现 。
层 包 括 L inux 操 作 系 统 及 驱 动 依 赖 于 从 L inux操作系统的角度来看 第一 、二层次之L inux216 内 核 不 支 持 linux214 内 核 。
如 An2 间是内核空间与用户空间的分界线 第一层运droid110 release - 110 使用 L inux216125 An2 行于内核空间 第二 、三 、四层运行于用户空droid116 sdk - 116 使 用 L inux216129。
除 了 间 。
第二 、三层之间 是本地代码层和 Java 代收稿日期 : 2010 - 05 - 27作者简介 : 胡伟 1973 — 男 河南信阳人 讲师 研究生 硕士 主要研究方向为嵌入式 L inux系统软硬件设计 、开发 。
962010 年第 4 期 总第 41 期 广州广播电视大学学报 Vol110 No14码层的接口 。
第三 、四层之间是系统 AP I接口 。
图 1
Android框架图 三 、
Android代码结构 — ——development 程序开发所需要的模
Android 代码 包 括 3 个 部 分 : ①核 心 工 程 板和工具 Core Project文件夹 是建立
Android 系统的基 — ——external 目标机器使用的一些库 础 在根 目 录 的 各 个 文 件 夹 中 ②扩 展 工 程 — ——frameworks 应用程序的框架层 External Project文件夹中 是使用其他开源项 — ——hardware 与硬件相关的库 目扩展功能 ③包 Package 提供
Android 的 ——kernel L inux216 的源代码 —应用程序和服务 。
其中既包含了原始
Android 的 — ——packages
Android 的各种应用程序 目标机代码 还包括了主机编译工具 、仿真环 — ——p rebuilt
Android 在各种平台下编译境等 。
的预置脚本 代码包经过解压缩后 第一级别的目录和 — —— recovery 与目标的恢复功能相关 文件如下所示 : — —— system
Android 的底层的一些库 M ydroid / 编译完成后 将在根目录中生成一个 out文 — ——M akefile 全局的 M akefile 件夹 所有生成的
Android代码结构内容均放置 — ——bionic 这里面是一些基础的库的源 在这个文件夹中 。
out文件夹如下所示 :代码 out/ ——bootloader 引导加载器 — ——CaseCheck1 txt — ——build 目录的内容不是目标所用的 — ——casecheck1 txt —代码 而是编译和配置所需要的脚本和工具 — ——host — ——dalvik JAVA 虚拟机 — ——common 972010 年第 4 期 总第 41 期 广州广播电视大学学报 Vol110 No14 — —— linux - x86 B inder驱动程序在内核中的头文件和代码 — —— target 路径如下 : ——common — Kernel/ include / linux / binder1 h ——p roduct — Kernel/ drivers/m isc / binder1 c 主要的两个目录为 host和 target 前者表示 在用户空间 libutil工具库和 Service M anager在主机 x86 生成的工具 后者表示目标机 守护进程中调用 B inder接口提供对整个系统的默认为 ARM v5 运行的内容 。
支持 。
Fram eworks/ base / cm ds/ servicemanager/ —— — 四 、
Android专用驱动 Server M anager守护进程的实现
Android 中内核的结构和标准 L inux216 内核 — Fram ewoks/ base / include / utils/ ——B inder 驱基本相同 但增加了部分私有内容 。
Android 在 动在用户空间的封装接口 标准的 L inux内核中的驱动主要分成两种类型 : — Fram eworks/ base / libs/ utils/ ——B inder 驱 动
Android 专用驱动和
Android 使用的设备 驱动 。
在用户空间的封装实现 。
其中主要的专用驱动包括 : A shmen: 匿名共享 B inder是
Android 中主要使用的 IPC 方式 内存驱动 Logger: 轻量级的 log驱动 B inder: 使用时通常只需要按照模板定义相关的类即可 基于 OpenB inder系统的驱动 为
Android平台提 不需要直接调用 B inder驱动程序的设备节点 。
供 IPC 支持
Android Power M anagement PM : 三 Logger电源管理模块 Low M emory Killer: 在缺少内存 该驱动程序为用户层程序提供 log支持 作的情况下 杀死进程
Android PM EM: 物理内 为一个工具使用 。
在用户空间中有 3 个设备节存驱动 。
点 : / dev / log /main、 / dev / log / event、 / dev / log / 一 A shmen radio 主设备号为 10 次设备号动态生成 。
即匿名共享内存 Anonymous Shared M emo2 Logger驱动在内核中的头文件和代码路径ry 为用户空间程序提供分配内存的机制 实 如下 :现类似 malloc 的功 能 。
其设 备节 点名 称为 : / Kernel/ include / linux / logger1 hdev / ashm en1主设备号为 10 次设备号动态生 Kernel/ driver/m isc / logger1 c成 。
其驱动程序在内核中的头文件和代码路径 在
Android的用户空间 logcat程序调用 Log2如下 : ger驱动 : Kernel/ include / linux / ashmen1 h — 可执行程序 。
System / core / logcat/ —— Kernel/mm / ashmen1 c Logcat是一个可执行程序 用于提取系统 在用户空间 C libutil库对 A shm en 进行封装 log信息 是系统的一个辅助工具 。
并提供接口 System / core / include / cutils/ ashm en1 h —— —简 五 、L inux 设 备 驱 动 在
Android 上 的 使 用单封装头文件 分析 System / core / libcutils/ ashmen - dev1 c ———匿 L inux设备驱动程序 在为智能手机定制的名共享内存在用户空间的调用封装
Android 操作系统中得到了广泛的应用 下面对 System / core / libcutils/ ashmen - host1 c —— —没 几 个比 较有 特色 的设 备驱 动的 使用情 况进 行有使用 。
分析 。
用于为
Android系统提供内存分配功能 。
一 Framebuffer显示驱动 二 B inder Fram ebuffer驱动在 L inux中是标准的显示设 为用户层程序提供进程间通信 IPC 支 备的驱动 。
对于 PC 系统 它是显卡的驱动 对持
Android 整个系统的运行依赖 B inder 驱动 。
于嵌入式 SOC 处理器系统 它是 LCD 控制器或其设备节点名称为 : / dev / binder 主设备号为 者其他显示控制器的驱动 。
它是一个字符设备 10 次设备号动态生成 。
在文件系统中设备节点通常是 / dev / fbx。
每个系 982010 年第 4 期 总第 41 期 广州广播电视大学学报 Vol110 No14统可 以 有 多 个 显 示 设 备 依 次 用 / dev / fb0、 / _ info dev / fb1 等来表示 。
在
Android 系统中主设备号 具体的 Framebuffer 驱动需要实现 fb _ info为 29 次设备号递增生成 。
结构 实现 fb_ op s中的各个函数指针 。
从驱动 该驱动在用户空间一般使用 ioctl、mm ap 等 程序的用户空间进行 ioctl调用时 会转换成调文件系统接口进行操作 ioctl 用于获得和设置 用其中的函数 。
信息 mmap 将 Framebuffer的内存映射到用户空
Android 对 Fram ebuffer驱动的使用方式是标间 。
驱动也可以直接支持 w rite 操作 用写的方 准的 在 / dev / graphic /中 的 Framebuffer 设 备 节式输出显示内容 。
显示驱动的架构如图 2 所示 。
点由 init 进程自动创建 被 libui 库调用 。
An2 droid 的 GU I系统中 通过调用 Framebuffer驱动 的标准接口 实现显示设备的抽象 。
二 Event 输入设备驱动 Input驱动程序是 L inux 输入设备的驱动程 序 分 为 游 戏 杆 joystick 、鼠 标 mouse 和 m ice 和事件设备 Event queue 3 种驱动程 序 。
其中事件驱动程序是目前通用的程序 可 支持键盘 、鼠标 、触摸屏等多种输入设备 。
In2 put 驱动程序的主设备号是 13 每一种 Input设 备从设备号占用 5 位 3 种从设备号分配是 : 游 戏杆 0 ~61 Mouse 鼠标 33 ~62 M ice 鼠标 63 图 2 Framebuffer显示驱动架构图 事件设 备 64 ~ 95 各 个 具 体 的 设 备 在 m isc、 touchscreen、 keyboard 等目录中 。
驱动的主要头 文件 位于 include / linux / fb1 h Event设备在用户空间使用 read、 ioctl、 poll文件 中 驱 动 核 心 实 现 位 于 drivers/ video / fb2 等文件系统的接口操作 read 用于读取输入信mem 1 c文件中 驱动中核心的数据接口是 fb _ 息 ioctl用于获取和设置信息 poll用于用户空info 在 fb1 h中定义 如下所示 。
间的阻塞 当内核有按键等中断时 通过在中 Struct fb_ info 断中唤醒内核的 poll实现 。
Event输入驱动的架 Int node 构如图 3 所示 : Int flags Struct fb_ var_ screeninfo var / 3 变化屏幕信息 3 / Struct fb _ fix_ screeninfo fix / 3 固定屏幕信息 3 / Struct fb_ op s 3 fbop s / 3 Framebuffer驱动的操作 3 / ……1 该结构包含了驱动主要信息 struct fb_ var_ screeninfo 和 Struct fb _ fix_ screeninfo 两个数据结构对应 FB I GET_ VSCREEN I FO 和 FB I 2 O N OGET_ FSCREEN I FO 这两个 ioctl从用户空间获 N得的显示信息 。
Fb_ op s表示 Fram ebuffer驱动的操作 通常通过以下函数进行注册 : 图 3 Event输入驱动架构图 Int register_ framebuffer struct fb_ info 3 fb 992010 年第 4 期 总第 41 期 广州广播电视大学学报 Vol110 No14 Input 驱动程序的头文件在 include / linux / in2 在用户空间中 ALSA 驱动通常配合 ALSAput1 h中 。
Input驱动程序的核心和 Event部分代 库使用 库通过 ioctl 等接口调用 ALSA 驱动程码 分 别 位 于 D rivers/ input/ input1 c 和 D rivers/ 序的设备节点 。
对于 ALSA 驱动的调用 调用的input/ evdev1 c 中 。
其中 Input1 h 中定义了 struct 是用户空间的 ALSA 库的接口 而不是直接调用input_ dev 结构 它表示 Input驱动程序的各种 ALSA 驱动程序 。
信息 对于 Event设备分为同步设备 、键盘相对 ALSA 音频驱动的架构如图 4 所示 。
设备 鼠标 、绝对设备 触摸屏 等 。
Event驱动程序需要定义 struct input_ dev结构体 并且通 过 input _ register _ device 函 数 进 行注册 。
Int _ _ must_ chect input_ register_ device struct input_ dev 3 Input设备驱 动在 内核 m enuconfig 配 置时 配置选项为 “Device D rivers” - gt “ Input De2 。
vice D rivers” Event 驱动程序配置对应的文件是 driver/ input/ Kconfig 其 配 置 选 项 是 .
上一篇:
在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序
下一篇:
网络教育