【Android源码 栏目提醒】:网学会员鉴于大家对Android源码 十分关注,论文会员在此为大家搜集整理了“Android系统非标准设备驱动程序设计 - 操作系统”一文,供大家参考学习
软件天地 Software Technology
Android 系统非标准设备驱动程序设计 孟小华 黄宗轩 暨 南 大 学 计 算 机 科 学 系 , 广 东 广 州 510632 摘 要 : 在 深 入 研 究
Android 硬 件 抽 象 层 HAL 和 Java 本 地 接 口 JNI 技 术 原 理 的 基 础 上 , 提 出 了 一个
Android 非 标 准 硬 件 驱 动 程 序 的 设 计 方 案 。
以 一 个 非 标 准 设 备 的 驱 动 程 式 的 实 现 为 例 介 绍 了 驱 动程 序 的 功 能 模 块 分 层 设 计 , 讨 论 了 使 用 HAL Stub 技 术 对 硬 件 抽 象 层 HAL 模 块 进 行 优 化 的 方 法 。
关 键 词 :
Android 设 备 驱 动 程 序 硬 件 抽 象 层 JNI 中 图 分 类 号 : TP316.8 文献标识码: A 文 章 编 号 : 1674-7720201114-0007-03 The design of non-standard device driver for
Android Meng Xiaohua , Huang Zongxuan Department of Computer Science Jinan University Guangzhou Guangdong 510632 China Abstract: This paper gives a solution of non-standard device driver design on the basis of in -depth analyzing the principle ofHAL and JNI. It introduces the layering design of the function module of driver through an implementation of device driver as ex -ample . Then it discusses the drivers optimization methods of the hardware abstraction layer by using HAL stub . Key words:
Android device driver HAL JNI
Android 系 统 是 Google 推 出 的 基 于 Linux 内 核 和 Java 用 程 序 使 用 Java 语 言 开 发 , 所 以 应 用 程 序 在 调 用 设 备 驱架构的操作系统,在很短的时间内已成 为主 流的手 机操 动 时 不 能 像 一 般 的 Linux 应 用 程 序 那 样 直 接 使 用 系 统 调作系统,并已逐步扩展应用到 嵌入 式系统 、平板 电脑和 用 , 必 须 通 过 Java 虚 拟 机 的 JNI 的 本 地 ( Native ) 方 法 使上 网 本 上 。
它 既 有 Linux 系 统 所 具 有 的 硬 件 平 台 可 移 植 用 设 备 。
另 一 方 面 ,
Android 要 成 为 一 个 通 用 性 强 的 平性 , 也 因 使 用 Java 语 言 开 发 应 用 程 序 带 来 了 应 用 软 件 只 台 , 必 须 加 强 它 的 可 移 植 性 。
这 也 是 在
Android 架 构 添 加编 写 一 次 即 可 在 所 有 平 台 运 行 的 巨 大 优 势 。
Android 虽 一 个 硬 件 抽 象 层 ( HAL )的 原 因 , 目 的 是 为 设 备 的 调 用 提 供然主要基于已有的技术 ,但在体系结 构设 计上有 较大 的 一 个更 高级的 封装 图 1 所示 为
Android 驱 动程 序架构 。
创新。
其主要设计目标之一就是要使应用程序和系统能独立于具体的计算机体系结构和硬件平台,表现在设备驱 动 程 序 设 计 上 , 对 于 已 有 的 Linux 标 准 设 备 驱 动 程 序可 以 直 接 继 续 使 用 , 只 需 为 其 增 加 应 用 层 JNI 接 口 。
但对 于 Linux 没 有 的 非 标 准 设 备 则 提 倡 在 Linux 内 核 中 驱动部分只做很少的接口工作 ,尽量把 驱动 程序的 主要 处理 放 在
Android 的 上 层 架 构 中 , 即 在 应 用 层 实 现 。
本 文 对
Android 系 统 的 底 层 实 现 技 术 进 行 深 入 的 研 究 , 包 括 An-droid 的 硬 件 抽 象 层 和 JNI 技 术 实 现 等 。
并 以 S3C2440 开发 板 上 的 LED 灯 设 计 显 示 驱 动 程 序 为 例 , 提 出 了 一种非标准硬件设备驱动程序的方案。
1
Android 系 统 驱 动 程 序 架 构1.1 驱 动 程 序 分 层 体 系 结 构 图 1
Android 驱 动 程 序 架 构
Android 是 基 于 Linux 的 , 它 使 用 了 Linux 内 核 , 但 应 《微型机与应用》 2011 年 第 30 卷 第 14 期 欢 迎 网 上 投 稿 www.pcachina.com 7 软件天地 Software Technology HAL Stub 是 以 Linux 共 享 库 .so 的 形 式 存 在 , 在 整 在
Android 应 用 层 中 的 程 序 或 组 件 都 是 用 Java 语 言个驱动 架构 中,它是 设备 驱 动 程 序 运 行 在 用 户 空 间 的 一 开 发 的 , 这 些 Java 代 码 编 译 后 变 成 Dex 格 式 的 字 节 码 ,部 分 , 它 向 上 为 Dalvik 虚 拟 机 提 供 硬 件 设 备 的 抽 象 接 由 Dalvik 虚 拟 机 执 行 , 在 执 行 过 程 中 需 要 调 用 本 地 库口 , 向 下 通 过 系 统 调 用 与 Linux 内 核 中 的 驱 动 程 序 进 行 时 , 由 虚 拟 机 载 入 这 些 本 地 库 , 然 后 让 Java 函 数 调 用 库数 据 交 互 。
在 这 个 过 程 中 HAL 可 以 对 驱 动 程 序 的 数 据 中 的 函 数 , 虚 拟 机 相 当 于 一 座 桥 梁 , 让 Java 与 本 地 库 能进 行 处 理 , 也 就 是 说 在 Linux 内 核 中 的 驱 动 程 序 部 分 只 够 透 过 标 准 的 JNI 界 面 互 相 沟 通 。
需要提供一个与硬件设备传输 数据接 口的 功能 ,而其余 应 用 程 序 在 虚 拟 机 里 执 行 , 通 过 函 数 System.loadLi-具 体 的 操 作 可 以 由 HAL 完 成 。
brary 通 知 虚 拟 机 载 入 指 定 的 库 , 例 如 在 Java 代 码 中 包1.2
Android 的 硬 件 抽 象 层 含代码如:
Android 的 硬 件 抽 象 层 HAL Hardware Abstract Layer … …在
Android 的 架 构 中 是 在 库 这 一 层 中 , 通 过 这 一 层 , 硬 件 System.loadLibrary “ sample_jni ” 厂商可以把部分设备的驱动
源码封装在这一层而不公 … …开源代码。
虚 拟 机 就 会 在
Android 文 件 系 统 的 “ /system/lib/ ” 目 录 对 图 1 分 析 , 设 计 HAL 就 是 为 了 把 应 用 框 架 和 Lin- 中 查 找 libsample_jni.so 库 文 件 虚 拟 机 载 入 libsample_jni.soux 内 核 分 离 出 来 , 让
Android 使 用 Linux 内 核 而 又 不 完 后 , Java 代 码 就 可 以 与 库 文 件 结 合 起 来 一 起 执 行 。
全 依 赖 Linux 内 核 。
当 然 , 驱 动 程 序 并 不 是 完 全 从 Linux 这些用 C 语言编写的 本地 库必 须遵循 规范 ,当虚拟内核中分离出来, 一些基本的处理必须由内核来完成, 机 执 行 System.loadLibrary 函 数 时 , 首 先 执 行 本 地 库 里 的HAL 只 是 分 担 了 Linux 设 备 驱 动 的 部 分 功 能 , 至 于 这 部 JNI_OnLoad 函 数 , 这 个 函 数 需 要 实 现 的 功 能 是 : 返 回 给分的功能占驱动程序功能的比例目前并没有一个标准。
虚 拟 机 此 本 地 库 使 用 的 JNI 版 本 ; 对 库 进 行 初 始 化 。
如 在
Android 系 统 发 展 过 程 中 , HAL 的 实 现 也 逐 步 有 果 本 地 库 里 没 有 实 现 JNI_OnLoad 函 数 , 虚 拟 机 就 会 默了 一 些 变 化 , 旧 的 HAL 是 一 种 模 块 化 的 思 想 , 通 过 共 享 认 本 地 库 使 用 最 老 的 JNI 1.1 版 本 。
库 的 形 式 由 Runtime 在 JNI 时 以 函 数 调 用 方 法 调 用 , 这 JNI_OnUnload 函 数 与 装 入 函 数 相 对 应 , 在 虚 拟 机 释种做法并没有通过封装, 即上层应用可以直接调用硬 放 该 本 地 库 时 , 会 调 用 JNI_OnUnload 函 数 进 行 资 源 回件 。
另外 ,这种 方法可 被多 个进程 使用 ,映射 到多个 进程 收动作。
空间中浪费内存资源。
在 应 用 层 的 Java 代 码 通 过 虚 拟 机 调 用 本 地 函 数 , 一 现 在 HAL 提 出 一 种 Stub 的 思 想 , HAL Stub 是 一 种 般要依赖于虚拟机查找库里的 本地 函数 ,如果需 要调 用代 理 的 概 念 , Stub 同 样 是 以 共 享 库 .so 格 式 存 在 , 但 上 比较频繁 ,每次都要寻 找一 遍 ,就会 花费 较多 的时间 影层 应 用 并 不 像 加 载 动 态 库 那 样 调 用 Stub 。
这 种 HAL 是 响 效 率 , 在 这 里 可 以 通 过 registerNativeMethods 函 数 把由 模 块 与 Stub 结 合 而 成 , Run- gMethods 表 格 所 含 的 本 地 函 数 注 册 到 虚 拟 机 里 。
time 通 过 模 块 提 供 的 统 一 接 口 2
Android 硬 件 驱 动 程 序 设 计获 取 并 操 作 Stub 。
Stub 向 HAL
Android 是 一 个 开 放 平 台 在 嵌 入 式 移 动 设 备 领 域 里提 供 操 作 的 回 调 函 数 , Runtime 具有 很好 的应 用前景 ,但在 不 同 的 设 备 上 往 往 有 不 同 的向 HAL 取 得 指 定 模 块 的 操 作 硬 件 支 持 , 要 在
Android 中 添 加 这 些 硬 件 应 用 , 不 是 单 纯函数后 ,调用 这些回 调函 数。
这 地 在 Linux 内 核 中 添 加 驱 动 模 块 , 还 必 须 在 用 户 空 间 和是一种间接函数调用的方式, 应 用 框 架 中 添 加 对 应 的 支 持 。
下 面 以 给 S3C2440 开 发 板HAL 里 包 含 了 多 个 Stub 。
图 2 添 加 一 个 LED 显 示 控 制 驱 动 功 能 为 例 展 示
Android 平 台 图 2 HAL Stub 原 理为 HAL Stib 原 理 。
添加新硬件支持的过程。
1.3
Android 的 JNI 实 现 原 理 2.1 硬 件 驱 动 程 序 的 框 架 JNI 是 Java Native Interface 的 缩 写 , 是 在 Sun 的 Java LED 控 制 功 能 通 过 应 用 程 序 来 开 关 开 发 板 上 的平 台 中 首 先 定 义 出 来 的 , 它 允 许 Java 代 码 与 其 他 语 言 代 LED 灯 。
在 应 用 层 中 LED 控 制 程 序 调 用 LED 控 制 服 务码 进 行 交 互 。
Android 中 JNI 的 设 计 目 的 也 是 一 样 :
Android Service , 应 用 层 中 的 LED 控 制 服 务 通 过 JNI 让 1 应 用 程 序 需 要 与 硬 件 平 台 交 互 时 , Java 库 中 的 虚 拟 机 加 载 LED 控 制 的 本 地 库 然 后 向 HAL 获 取 LED类不可能支持; Stub , 由 Stub 调 用 在 Linux 内 核 中 的 LED 驱 动 。
图 3 为 2 本 地 已 经 使 用 其 他 语 言 编 写 的 库 允 许 Java 程 序 LED 控 制 功 能 的 架 构 设 计 。
访问; 从 LED 控 制 功 能 的 架 构 来 分 , 整 个 功 能 可 以 分 成 五 3 某 些 功 能 用 较 低 级 的 语 言 实 现 的 执 行 效 率 较 个 模 块 : LED 驱 动 模 块 、 LED Stub 模 块 、 LED 本 地 服 务 模高 , 让 Java 程 序 调 用 这 些 函 数 。
块 、 LED 服 务 管 理 模 块 和 LED 应 用 模 块 。
8 《微型机与应用》 2011 年 第 30 卷 第 14 期 软件天地 Software Technology 口 , 在 本 地 服 务 获 得 Stub 对 象 后 调 用 , 它 负 责 申 请 结 构 体 led_control_device_t 的 空 间 , 填 充 信 息 , 注 册 具 体 操 作 的 回 调 函 数 接 口 并 打 开 LED 驱 动 。
结 构 体 led_control_device_t 继 承 了 hw_device_t , 在 open 函 数 调 用 时 填 充 的 主 要 信 息 包 括 : tag : 结 构 体 的 类 型 , 这 里 的 值 为 HARDWARE_DE- VICE_TAG ; module :Stub 的模块 也就是实例 HAL_MODULE_INFO_ SYM 中 的 hw_module_t 部 分 ; close : 释 放 LED Stub 的 回 调 函 数 ; 图 3 LED 控 制 功 能 的 架 构 设 计 fd : 打 开 设 备 驱 动 文 件 返 回 的 文 件 描 述 符 ; ns_set_on : 打 开 LED 灯 的 回 调 函 数 指 针 ;2.2 HAL 中 的 Stub 的 设 计 与 实 现 ns_set_off : 关 闭 LED 灯 的 回 调 函 数 指 针 。
图 4 是 LED Stub 的 实 现 过 程 。
LED Stub 是 硬 件 抽 回 调 函 数 指 针 “ ns_set_on ” 和 “ ns_set_off ” 分 别 指 向象 层 中 LED 控 制 的 代 理 , 当 LED 控 制 的 本 地 服 务 需 要 实 现 函 数 hal_ led_on 和 hal_led_off , 在 实 现 函 数 中 通调 用 LED Stub 时 通 过 函 数 hw_get_module 结 合 LED 过 系 统 调 用 ioctl 对 LED 灯 进 行 开 关 控 制 。
Stub 的 模 块 ID 向 HAL 申 请 LED Stub , 本 地 服 务 获 得 2.3 硬 件 控 制 服 务 的 JNI 实 现Stub 对 象 后 , 可 以 把 Stub 看 作 一 个 抽 象 硬 件 进 行 操 作 。
LED 控 制 本 地 库 编 译 后 为 “ libled.so ” 保 存 在
Android 文 件 系 统 的 “ /sysem/lib/ ” 目 录 下 面 , LED 控 制 服 务 的
Android 进 程 运 行 后 由 虚 拟 机 实 例 装 入 本 地 库 , 具 体 实 现过程如图 5 所示。
图 4 LED Stub 的 实 现 过 程 下 面 是 定 义 LED Stub 的 HAL 结 构 体 :struct led_module_t struct hw_module_t common 图 5 LED 控 制 服 务 的 JNI 实 现 过 程struct led_module_t LED 控 制 服 务 调 用 System.load 函 数 , 它 的 虚 拟 机 struct hw_module_t common 实 例 就 会 装 入 LED 控 制 本 地 库 , 虚 拟 机 会 首 先 调 用 int fd JNI_OnLoad 函 数 完 成 : intns_set_onstruct led_control_device_tdev int32_t led 1 把 虚 拟 机 环 境 信 息 保 存 到 本 地 库 的 一 个 结 构 体 intns_set_offstruct led_control_device_tdev int32_t led “ JNIEnv ” 的 实 例 中 ; 2 建 立 一 个 应 用 层 中 的 LED 控 制 服 务 与 本 地 库 的 将 结 构 体 led_module_t 初 始 化 一 个 实 例 名 为 JNI 函 数 表 ;HAL_MODULE_INFO_SYM , 这 个 名 称 不 能 修 改 , 实 例 里 包 3 返 回 虚 拟 机 本 地 库 使 用 的 JNI 版 本 。
含 了 Stub 的 模 块 信 息 , 主 要 包 括 : 加 载 完 后 , 应 用 层 中 的 LED 控 制 服 务 就 可 以 通 过 虚 tag : 标 记 了 结 构 体 的 类 型 , 这 里 的 值 为 HARD- 拟 机 中 的 JNI 函 数 表 把 运 行 的 Java 函 数 转 换 为 本 地 函WARE_MODULE_TAG ; 数 执 行 。
在 LED 控 制 服 务 类 中 定 义 有 JNI 函 数 的 方 式 id : LED Stub 的 模 块 ID , 在 本 地 服 务 向 HAL 获 取 例如下面的代码段:Stub 时 调 用 的 函 数 hw_get_module 中 , 通 过 这 里 的 id 查 public final class LedService extends IledService . Stub 找 LED Stub ; …… . methods : 是 结 构 体 hw_module_methods_t 的 实 例 , 为 static HAL 定 义 回 调 函 数 open 。
System . load “ /system /lib/libled . so ” 这 里 的 open 函 数 是 一 个 必 须 实 现 的 回 调 函 数 接 下 转 第 12 页 《微型机与应用》 2011 年 第 30 卷 第 14 期 欢 迎 网 上 投 稿 www.pcachina.com 9 软件天地 Software Technology 用例的 设计 遍历到 特性 的功 能 、互操 作性 、性能、压 Bug 数 力 、稳 定 性 的 测 试 范 围 ,且 实 验 室 模 拟 现 网 环 境 执 行 用 例 。
由 Bug 提 交 的 DI 值 可 以 看 出 , 以 上 用 例 的 执 行 覆 盖 了 大 90 .