深入剖析Linux内核与设备驱动.pdf

上传人:紫竹语嫣 文档编号:5518839 上传时间:2020-05-28 格式:PDF 页数:708 大小:18.97MB
返回 下载 相关 举报
深入剖析Linux内核与设备驱动.pdf_第1页
第1页 / 共708页
深入剖析Linux内核与设备驱动.pdf_第2页
第2页 / 共708页
深入剖析Linux内核与设备驱动.pdf_第3页
第3页 / 共708页
深入剖析Linux内核与设备驱动.pdf_第4页
第4页 / 共708页
深入剖析Linux内核与设备驱动.pdf_第5页
第5页 / 共708页
点击查看更多>>
资源描述

《深入剖析Linux内核与设备驱动.pdf》由会员分享,可在线阅读,更多相关《深入剖析Linux内核与设备驱动.pdf(708页珍藏版)》请在三一文库上搜索。

1、 深入剖析 Linux 内核与设备驱动 董 峰 编著 机 械 工 业 出 版 社 本书从需求的角度出发, 以层次分析的方法探究 Linux 内核以及驱动 的各部分框架和实现; 以 TI 的嵌入式芯片为例, 对内核各部分功能特别 是电源管理功能进行代码级别的分析; 以需求是什么、 如何实现相应需求 来进行整体分析, 更易于对系统的把握和理解。 本书将软件和硬件结合起 来详细分析了嵌入式处理以及 Linux 内核实现中的各种技术。 本书可以作为本科和研究生操作系统的参考书, 也适合 Linux 内核、 驱动以及嵌入式系统各种级别的开发者和爱好者阅读。 图书在版编目 (CIP) 数据 深入剖析 Li

2、nux 内核与设备驱动/ 董峰编著 北京: 机械工业出版社, 2014 9 ISBN 978 -7 -111 -49426 -3 深 董 Linux 操作系统 -程序设计 TP316 89 中国版本图书馆 CIP 数据核字 (2015) 第 035932 号 机械工业出版社(北京市百万庄大街 22 号 邮政编码 100037) 策划编辑: 时 静 责任校对: 张艳霞 责任编辑: 刘 悦 责任印制:乔 宇 2015 年 3月第 1 版第 1 次 184mm 260mm44 25 印张1098 千字 0001 - 2500 册 标准书号: ISBN 978 -7 -111 -49426 -3 定价

3、:99.80元 凡购本书,如有缺页、倒页、脱页,由本社发行部调换 电话服务网络服务 服务咨询热线:(010)88379833 读者购书热线:(010)88379649 封面无防伪标均为盗版 机 工 官 网:www cmpbook com 机 工 官 博:weibo com/ cmp1952 教育服务网:www cmpedu com 金书网:www golden - book com 保定市中画美凯印刷有限公司印刷 前 言 笔者从研究生学习期间开始接触 Linux 内核至今已十年有余, 直到现在仍然在研读各种 内核书籍, 细读之后始终有一些疑问和困惑。 Linux 内核的需求从何而来, 是怎样的

4、需求? Linux 内核的层次结构是怎样的? 每个功能模块是如何划分的? 为什么要这么设计? 多种设 备及驱动应该如何划分, 划分的依据是什么? 设备模型究竟是怎么回事? 电源管理技术是如 何实现的? 处理器与 Linux 内核之间的功能关系是怎样的? 本书就是建立在对这些问题的思 考和解答基础上的, 读者可以在阅读本书的过程中找到这些问题的答案。 这些问题的解答对 于各种层次的开发者来说都是需要的, 一方面, 可以加深开发者对于系统的理解, 做到明其 理的程度; 另一方面, 从需求出发也符合对事物理解的规律, 可加深对系统的认识。 笔者有幸于 2003 年加入 TI 开始嵌入式处理器开发之旅

5、。 TI 开放的文化使笔者有很多机 会了解芯片的先进技术, TI 完备的开发文档使笔者可以了解各种实现细节, 从而不断地成 长。 在进行了大量的代码注释工作后, 笔者终于解答了之前的问题, 从而写出了本书。 本书在结构编排上, 从基础出发, 使各章节相对独立, 但是少量的向前或者向后引用还 是必不可少的。 总体上, 本书是将最基本的章节尽量放到前面, 所以推荐按顺序阅读。 在代码的引用上, 以 TI 发布的 DM 3730 的 Android 版本中内核代码为主, 为了突出主 线部分和削减本书的篇幅, 笔者以核心功能代码为主进行分析和介绍, 而省略了辅助型代 码。 内核的代码是不断演进的, 如

6、果掌握了书中分析代码的思路, 那么读者自己来对新版本 的内核进行理解也不是不可能的。 因为笔者水平所限, 加之 Linux 内核本身就博大精深, 所 以书中肯定还会有一些错误, 希望读者朋友们能不吝批评指正, 以使大家可以共同提高。 读者如果在阅读本书的过程中有任何意见或者建议, 欢迎通过下面的 E - mail 与笔者取 得联系: dong1feng sina com。 关于本书使用到的源代码, 读者可在 TI 网站上获取。 在本书写作过程中, 父母和妻子给予了我很多生活上及精神上的支持, 妻子还主动承担 了校对的工作, 谨以此书献给他们。 另外特别提到岳父和岳母, 是他们在女儿两岁前悉心的

7、 照料, 使得我拥有独立而充足的时间进行学习和研究, 在此表示由衷的感谢。 感谢宝贝女儿 花生, 她的出生带来很多欢乐, 也是我写作的动力之源。 还要感谢机械工业出版社的时静编辑, 从选题的论证到文字编辑, 他都付出了极其辛苦 的劳动并且提出了很多有益的建议。 最后要感谢在 TI 遇到的兄弟姐妹们, 用这本书来纪念我们一起战斗的日日夜夜。 董 峰 目 录 前言 第 1 章 引言1 1 1 为什么要从硬件设备的角度看 Linux 内核1 1 2 从了解硬件开始2 1 2 1 最小系统2 1 2 2 完整设备介绍3 1 2 3 电源管理相关基础5 1 3 从设备看内核应该满足的需求6 1 4 所涉

8、及的重要概念6 1 5 小结8 第 2 章 TI 应用处理器芯片及其内核 特点9 2 1 DM 3730 微处理器9 2 1 1 DM 3730 微处理器框架10 2 1 2 DM 3730 微处理器特性11 2 1 3 DM 3730 微处理器电源管理 相关设计12 2 2 DM 81XX 系列微处理器20 2 2 1 DM 81XX 系列微处理器框架20 2 2 2 DM 81XX 系列微处理器特性23 2 2 3 DM 81XX 系列微处理器电源 管理相关设计24 2 3 Sitara 系列芯片28 2 3 1 Sitara 系列芯片框架29 2 3 2 Sitara 系列芯片特性31

9、2 3 3 Sitara 系列芯片电源管理相关 设计31 2 4 TI 处理器内核特殊代码结构33 2 5 小结38 第 3 章 Linux 内核框架探究39 3 1 内核框架概述40 3 1 1 Linux 内核的层次分析40 3 1 2 Linux 内核模块间关联46 3 2 需求探究47 3 2 1 对内核核心的需求探究48 3 2 2 对设备管理的需求探究48 3 3 按需求的设备分类51 3 3 1 功能型设备55 3 3 2 总线型设备57 3 4 系统实现各种无关性的框架59 3 4 1 体系结构无关59 3 4 2 功能型设备的框架与总线无关62 3 4 3 总线控制器与总线设

10、备的无关62 3 4 4 设备属性和设备操作无关64 3 4 5 策略和机制无关66 3 5 内核提供的基本服务和接口 简介67 3 5 1 基本数据类型67 3 5 2 基本原子操作70 3 5 3 延时、 调度、 定时器相关71 3 5 4 锁操作72 3 5 5 抢占和屏障73 3 6 小结74 第 4 章 内核核心介绍及硬件的具体 实现75 4 1 内核初始化75 4 1 1 内核初始化的基本需求75 4 1 2 内核初始化框架介绍76 4 1 3 TI 芯片内核初始化相关实现 详解77 4 2 地址映射121 4 2 1 地址映射的基本需求121 4 2 2 地址映射框架介绍122

11、4 2 3 TI 芯片地址映射相关实现详解131 4 3 中断处理136 4 3 1 中断的基本需求137 4 3 2 中断处理框架介绍138 4 3 3 TI 芯片中断处理相关实现详解143 4 4 内存管理161 4 4 1 内存管理的基本需求161 4 4 2 内存管理框架介绍162 4 4 3 TI 芯片内存管理相关实现详解189 4 5 直接存储器访问单元 (DMA)192 4 5 1 DMA 使用和管理基本需求192 4 5 2 DMA 使用和管理框架介绍193 4 5 3 TI 芯片 DMA 使用和管理相关 实现详解200 4 6 时钟 (clock)221 4 6 1 cloc

12、k 管理基本需求221 4 6 2 clock 管理框架介绍221 4 6 3 TI 芯片 clock 管理相关实现 详解225 4 7 时间管理 (Time)248 4 7 1 时间管理基本需求248 4 7 2 时间管理框架介绍249 4 7 3 TI 芯片时间管理相关实现 详解251 4 8 通用目的输入输出 (GPIO)255 4 8 1 GPIO 管理基本需求255 4 8 2 GPIO 管理框架介绍256 4 8 3 TI 芯片 GPIO 管理相关实现 详解260 4 9 引脚复用 (pin mux)275 4 9 1 引脚复用的基本需求275 4 9 2 引脚复用框架介绍275

13、4 9 3 TI 芯片引脚复用相关实现 详解276 4 10 小结290 第 5 章 内核设备管理以及驱动基础 框架292 5 1 VFS 及其与设备的关联292 5 1 1 VFS 框架292 5 1 2 VFS 与设备关联303 5 2 Linux 设备模型 (Linux device model)304 5 2 1 设备模型的需求及基本设计304 5 2 2 总线 (bus)311 5 2 3 驱动 (driver)314 5 2 4 设备 (devices)317 5 2 5 功能类 (class)324 5 2 6 设备资源管理 (device resource)325 5 3 字符

14、设备 (char device)326 5 3 1 字符设备的特点和需求326 5 3 2 字符设备的核心数据结构及 操作327 5 3 3 字符设备子类型333 5 4 块设备 (block device)334 5 4 1 块设备特点和需求334 5 4 2 块设备核心数据结构及操作335 5 4 3 块设备子类型346 5 5 电源管理347 5 5 1 电源管理特点和需求347 5 5 2 电源管理核心框架介绍348 5 6 内核提供的同步操作、 异步事件 与单独执行实体的服务366 5 6 1 同步操作服务366 5 6 2 异步事件368 5 6 3 单独执行实体服务375 5 7

15、 内核提供的数据保护一致性操作 服务380 5 7 1 数据保护一致性操作服务的 需求380 5 7 2 各种数据保护一致性操作简介380 5 8 小结381 第 6 章 设备驱动之功能型驱动382 6 1 输入设备 (input)382 6 1 1 输入设备需求382 6 1 2 输入设备框架解析382 6 1 3 输入设备应用层操作及框架 适配398 6 1 4 TI 芯片输入设备相关实现详解402 6 1 5 输入设备电源管理相关说明407 6 2 帧缓冲 (frame buffer)410 6 2 1 帧缓冲设备需求410 6 2 2 帧缓冲框架解析411 6 2 3 帧缓冲应用层操作

16、及框架 适配422 6 2 4 TI 芯片帧缓冲驱动相关实 现详解428 6 2 5 帧缓冲驱动电源管理相关 说明443 6 3 音频设备 (audio ALSA)447 6 3 1 音频设备需求447 6 3 2 音频驱动框架解析448 6 3 3 音频驱动应用层操作及框架 适配484 6 3 4 TI 芯片音频驱动相关实现 详解493 6 3 5 音频驱动电源管理相关说明515 6 4 视频驱动 (V4L2)525 6 4 1 视频驱动需求525 6 4 2 视频驱动框架解析525 6 4 3 视频驱动应用层操作及框架 适配554 6 4 4 TI 芯片视频驱动相关实现 详解564 6 4

17、 5 视频驱动电源管理相关说明581 6 5 小结584 第 7 章 设备驱动之总线型驱动585 7 1 内部集成电路总线 (I2C)585 7 1 1 I2C 总线驱动需求585 7 1 2 I2C 总线驱动框架解析586 7 1 3 TI 芯片 I2C 总线驱动相关实现 详解599 7 1 4 I2C 总线驱动电源管理相关 说明612 7 2 串行外设接口总线 (SPI)614 7 2 1 SPI 总线驱动需求614 7 2 2 SPI 总线驱动框架解析615 7 2 3 TI 芯片 SPI 总线驱动相关实现 详解625 7 2 4 SPI 总线驱动电源管理相关 说明636 7 3 多媒体

18、卡 (MMC)637 7 3 1 MMC 需求637 7 3 2 MMC 框架解析639 7 3 3 TI 芯片 MMC 相关实现详解657 7 3 4 MMC 电源管理相关说明667 7 4 通用串行总线 (USB)669 7 4 1 USB 总线驱动需求669 7 4 2 USB 总线驱动框架解析671 7 4 3 TI 芯片 USB 总线驱动相关实现 详解682 7 4 4 USB 总线驱动电源管理相关 说明687 7 5 小结689 第 8 章 设备驱动之 SoC 特殊驱动690 8 1 SoC 电源管理核心技术详解690 8 1 1 SoC 电源管理需求690 8 1 2 TI 芯片

19、 SoC 电源管理相关实现 详解690 8 2 小结699 参考文献700 第 1 章 引 言 1. 1 为什么要从硬件设备的角度看 Linux 内核 Linux 内核作为目前最成功以及发展最快的开源项目之一, 在实际应用中取得的巨大成 功是举世瞩目的。 对庞大的 Linux 内核, 大家是否有如下的疑问: 究竟是哪些组织和个人为 它的实现做出了贡献呢? 又分别做出了多大的贡献呢? Linux Foundation 于2013 年9 月发布了 Who Writes Linux 报告 , 公布了最新的不同组 织对 Linux 内核贡献的情况, 见表 1-1。 表 1-1 不同组织对 Linux

20、内核贡献 公 司修 改 次 数百 分 比公 司修 改 次 数百 分 比 None12,55013. 60%NVidia1,1921. 30% Red Hat9,48310. 20%Freescale1,1271. 20% Intel8,1088. 80%Ingics Technology1,0751. 20% Texas Instruments3,8144. 10%Renesas Electronics1,0101. 10% Linaro3,7914. 10%Qualcomm9651. 00% SUSE3,2123. 50%Cisco8710. 90% Unknown3,0323. 30%Th

21、e Linux Foundation8400. 90% IBM2,8583. 10%Academics8310. 90% Samsung2,4152. 60%AMD8200. 90% Google2,2552. 40%Inktank Storage7090. 80% Vision Engraving Systems2,1072. 30%NetApp7070. 80% Consultants1,5291. 70%LINBIT7050. 80% Wolfson Microelectronics1,5161. 60%Fujitsu6940. 70% Oracle1,2481. 30%Parallel

22、s6840. 70% Broadcom1,2051. 30%ARM6640. 70% 贡献前 30 名的公司中半导体厂商就有 11 家, 约占三分之一, 如果算上硬件相关的公司 会超过 20 家, 贡献总量超过了 60%。 可见硬件厂商对 Linux 内核的贡献是很大的, 对 Linux 内核的影响也是巨大的。 从这份表中笔者惊喜地发现, 笔者之前就职的公司 Texas Instru- ments (简称 TI) 也在其中, 并且贡献量排名第四, 在半导体厂商中仅在 Intel 巨头之后。 在 主要以 ARM 为核心的半导体的厂商中 (如 TI、 三星、 高通、 博通、 英伟达、 飞思卡尔),

23、 TI 的贡献则排名第一。 Linux 内核的开发需要硬件厂商的支持和参与, 源于两个方面: 一方面硬件是 Linux 内 核工作的环境和基础, 内核需要使用相应的硬件; 另一方面 Linux 内核的发展趋势是在提高 硬件的使用效率的同时保证设备功耗的最小化。 这些都要求硬件厂商更多地参与到内核的开 发以及设计工作中, 只有更好地理解硬件才能更好地设计与实现内核。 理解硬件能使我们更 1 好地理解内核的各个组成部分, 在驱动方面理解硬件及其工作方式则更为重要。 1. 2 从了解硬件开始 内核是执行在处理器之上的, 从 Linux Foundation 发布的 Who Writes Linux

24、报告中我 们已经看到, TI 在以 ARM 为核心的嵌入式处理器厂商中贡献排名第一, 本书以 TI 的嵌入式 处理器 DM 3730 为主介绍内核以及驱动的实现, 同时会扩展到 TI 的 Davinci 系列和 Sitara 系 列芯片。 涉及到的知识可以扩展到所有处理器的内核以及驱动的实现, 只是一些实现机制和 细节不同罢了。 1. 2. 1 最小系统 我们先从系统的角度看看, 最基本的硬件需求是什么? 笔者认为是能执行, 能进行运 算。 并不需要复杂的输入输出设备, 只要能处理数据、 能运行就可以。 那么这种需求的最小 系统是什么样子的呢? 图1-1 是 LogicPD 公司基于 DM 3

25、730 处理器的 SOM (System on Module)。 可以看到非常 的小, 比硬币大不了多少, 这个系统只要接上电池就可以运行了。 不要以为这么小, 能力就 弱。 Motorola 的里程碑系列手机使用的就是同样的处理器核心, 是不是有些 “007” 设备的 感觉呢! 图 1-1 LogicPD DM 3730 SOM 示意图 再来看看 LogicPD 的 SOM 都有些什么, 系统框图如图 1-2 所示。 主要的芯片就三个: PMIC: 它负责供电。 DM 3730: 它是主处理器。 NAND Flash/ mDDR SDRAM chip : 它是存储芯片, 一个芯片中包括 mD

26、DR SDRAM 和 NAND Flash。 大家注意到框图中的 PoP technology 了吗? PoP 是 Package on Package 的缩写, 就是把两 个芯片背靠背地焊在一起, 这个非同一般, 说明它们的关系非常亲密, 要不为什么不把别的 芯片 PoP 在一起呢。 PoP 在一起的芯片分别是主处理器 DM 3730 和 NAND Flash/ mDDR SDRAM chip。 主处理器和内存是所有系统必需的, 关系自然紧密了, 这是能 PoP 的资本。 PoP 的优势很明显就是使电路板的面积减小了, 这个对于手机等对电路板大小要求高的设备 来说是非常重要的。 另外需要注意

27、两点: 其一是框图的左上从 Connectors 引入的 power, 其二是两个时钟 2 图 1-2 LogicPD DM 3730 SOM 系统框图 (一个是 32 kHz Crystal, 另一个是 26 MHz Oscillator)。 为什么要用两个时钟, 后续讲解电源 管理实现时会讲到。 注意这两点主要是想向大家说明, 数字系统中, power 和 clock 的概念 一定要有, 任何数字芯片以及芯片内部的数字模块都需要 power 和 clock, 没有了两者中任 何一个, 相应的数字部分都无法工作。 换句话说, 要想使数字模块工作, 首先要提供 power 和 clock。 p

28、ower 和 clock 也会贯穿整个电源管理以及内核的驱动中。 这是本书强调的第一个 概念, 也是非常重要的概念。 剩下的就是和 Connectors 连接的输入输出设备, 后续章节讲驱动的时候都会涉及。 笔者和朋友一起做的 SOM 也是这种类型。 只是将 NAND Flash/ mDDR SDRAM chip 换成了 EMMC/ mDDR SDRAM chip, 虽然不能通过 PoP 技术来减小电路板面积, 但是可以使用大容量的 EMMC 来支持 Android 4.3 (NAND 对 Android 来说容量太小), 从这个角度来说算是一件好事。 1. 2. 2 完整设备介绍 只是 SO

29、M 的话没有太多使用价值, 真正的设备是要连接很多复杂外设的, 以 DM 3730 为基础的设备框图如图 1-3 所示。 图 1-3 引自 TI 的 DM 3730 芯片手册 中第 136 页框图, 为了方便读者在芯片手册中 查找相关的内容, 会在引用芯片手册框图时说明其所在的页码。 笔者从对硬件毫无了解的计 算机软件专业毕业生到目前个人感觉对嵌入式真正了解的开发者的成长过程中, TI 的芯片 手册给了我很大的帮助, 其中详细讲解了诸多的原理和实现细节。 当然很多人会觉得几千页 的芯片手册无从下手, 但是对钻研技术的人来说这些可是宝贝。 如果大家可以静下心来仔细 品味, 绝对会受益匪浅。 图中

30、, DM 3730 通过各种连接方式连接了各种设备, 输入输出设备根据不同的类型大体可 以分为电源管理、 用户输入、 显示输出、 图像采集、 存储以及无线设备等。 我们可以将 DM 3730 与这些设备的数据接口分为总线和单一的数据接口总线。 总线 (如 I2C、 SPI 和 USB) 的 显著特点是单个总线上可以连接多个设备 (如 User Interface 部分 Finger Print 和 Touch Screen 都是通过 SPI 总线和 DM 3730 进行连接); 单一的数据接口只连接单一类型的设备 (如用于用 3 图 1-3 基于 DM 3730 的设备框图 户显示 LCD 输

31、出的 DSI 接口)。 各种不同类型的数据连接接口其设计思想以及功能是不同的, 例如 I2C 通常用于设备的控制, McBSP 用于音频数据的传输等。 需要注意的是同一总线可以连 接不同类型的设备, 比如 MMC 可以连接 SD 卡也可以连接 WIFI 设备。 这些接口都是长期发展 的行业标准, 是需要软件适应并满足的需求。 DM 3730 作为 SoC, 其中包含图中所有接口控制 器, 相应的控制器用于按照相关的总线和接口标准进行数据传输。 驱动的开发人员必须了解对 应的总线以及接口知识, 相关知识理解越深刻, 解决问题就越游刃有余。 为什么要有这么多连接方式呢? 这和数据传输的需求、 数据

32、的特性及复杂程度相关, 比 如数字信号通常依靠 clock 信号同步, 那么相应的带宽就是 Fclock bits, bits 为并行传输的 位数, 总线设计的时钟频率范围不同、 位数不同相应的带宽就不同, 而频率和位数不能随意 提高, 高速信号会产生电磁效应影响其他信号的完整性, 另外从需求的角度来讲, 不是所有 类型的数据都需要高速传输, 比如控制数据可以通过 I2C 传输, 这种 2 线低时钟扩展性较好 的总线, 能够方便的进行硬件设计并通过其连接各种各样的传感器, 丰富我们的实际生活。 在高速数据总线设计方面, 信号频率越来越高, 并行信号在高主频时会有先天的劣势, 很难 保证信号完整

33、性, 而差分信号则可以避免相应的问题, 现如今视频输入输出、 高速硬盘、 PCI 甚至连外部 memory 都逐渐转向差分信号的传输方式, 伴随而来的问题就是对相关接口的调试 会复杂一些, 需要理解协议。 另外信号的分析需要专门的设备, 这和调试并行信号只需要示波 器比起来就显得复杂得多了。 总之对接口来讲, 最需要了解数据是如何组织传输的。 4 1. 2. 3 电源管理相关基础 目前嵌入式设备很多都是电池供电, 这类设备电池续航能力成为人们重点关注的指标之 一, 这就引出了一个新的技术方向 电源管理技术。 首先了解一下嵌入式芯片功耗和哪些因素相关: The active power for

34、a CMOS device is defined as: P = CV2F, where P = active power needed for switching, C =total capacitance being switched, V =operating voltage and F =switching frequency。 这段英文说明了影响功耗的因素, C 主要和芯片的逻辑单元的状态相关, 通常逻辑单元 关掉时 C 的值比较低; V 是操作电压; F 是工作频率。 注意功耗的需求是在稳定工作的前提 之下的, 而从公式中明显看出影响最大的因素是 V。 围绕着 C、 V 和 F 会

35、有很多电源管理技 术的实现, 后续会有详细的解析。 图 1-4 DM 3730 与电源管理芯片连接框图 接下来以 DM 3730 为例了解一下主芯片和电源管理芯片的连接, 如图 1-4 所示。 5 图 1-4 是引自 DM 3730 芯片手册 中第 239 页的框图, 其中 PRCM 是 power reset clock management 的缩写, 它是对电源、 启动信号和时钟进行管理的模块。 从图中我们看到 时钟信号 (如 sys_32k) 和多个电源 (如 vdd 开头的连接) 都是由电源芯片 (Power IC) 提 供的, 为什么要提供多个电源呢? 这是因为 SoC 中不同的工作

36、单元需要的电压不同, 如果都 要求高电压, 根据之前的公式, 功耗影响会比较大, 通过隔离不同的工作电压可以降低整体 的功耗。 电源管理技术的大部分操作就是围绕着这几路电源和时钟展开的。 这里我们看到一路电源的名字是 vdda_sram, 这说明芯片内部有 sram, 这部分 memory 在 系统启动和电源管理的一些特殊操作时起到至关重要的作用, 另外这部分 memory 访问效率 非常高, 可以用来提高系统性能。 在图中还有诸多疑问, 比如 PRCM 详细内容, 具体功能是什么? 两个 I2C 接口的作用是 什么? 多路电源 (如 vdd_mpu_iva 等) 具体功能是什么? 其他部分的

37、信号起什么作用? 这里 先了解基本概念, 这些疑问会在后续电源管理的详解中进行说明。 1. 3 从设备看内核应该满足的需求 对硬件有了基本的了解, 就可以从硬件出发考虑内核应该满足的需求了。 硬件的类型是多种多样的, 连接的接口也是变化多样的, 作为内核的一个最基本的要求 就是能够访问并操作这些设备, 这就需要大量的设备驱动支持。 同时也要支持各种不同的数 据连接接口。 内核也需要支持各种总线, 并且要支持各种类型的设备, 由于总线要符合一定 的协议并连接多个设备, 所以通常分为总线控制的主设备以及连接进行总线响应的从设备; 内核会应用到各种设备, 所以需要同时为各种总线的主设备以及从设备提供

38、支持。 当然电源 管理的需求会涉及以上各种设备、 总线和接口。 另外内核不能只是支持特定的处理器, 需要 支持各种类型的处理器, 学术一点的说法就是要支持各种体系结构。 还有一点比较重要的思路就是, 大型的系统会涉及很多人共同开发, 这就对代码的可维 护性和重用性提出了很高的要求, 针对这个需要在设计过程中内核会将各种共同的资源抽象 出来统一管理, 并考虑硬件无关性形成相应的模块或者函数接口以供开发者使用。 总结下来从设备出发看内核要满足以下需求: 能支持不同的体系结构和处理器。 能支持不同的总线连接以及总线设备。 能支持不同的数据连接接口以及相应的设备。 能支持各个级别的电源管理功能。 设计

39、时要考虑硬件无关性提高各模块的重用性。 前四项都是比较直接的需求, 第五项则是考验开发人员的设计能力, 也是内核的各个模 块的设计重点以及我们研究的重点。 1. 4 所涉及的重要概念 谈到 Linux 内核, 大家的第一感觉就是一个庞大的系统、 很多的模块和功能, 实在是太 复杂了。 究竟如何入手是个问题。 对系统的理解有很多的方法: 自顶向下、 自底向上等。 笔 6 者更认同自顶向下按层次分析的方法。 顶部是用户的直接接口和需求体现, 按照需求从整体 到局部会更容易理解系统, 也更容易设计与实现系统。 整本书的论述也是从需求出发试图按 照 What (需求是什么)How (如何实现) 的逻辑

40、解释系统、 子系统及各个模块。 本书中还会涉及一些重要的概念, 如资源、 数据、 数据流、 接口、 临界区、 锁、 执行实 体、 上下文、 同步、 异步、 时间、 空间和抽象等。 需要读者对这些概念有基本的认识。 下面 重点介绍这些概念与需求之间是怎样的关系。 首先需求分为功能需求和性能需求, 这两种需求都会影响系统的实现。 在实现需求的时候要考虑资源, 有哪些资源可以使用, 如何使用来满足需求, 这些都是 要考虑的。 需要注意的一点是资源通常都是共享的, 对某个共享资源的管理使用通常就会抽 象成系统的一个模块。 对硬件来说, 处理器、 memory、 clock、 power supplie

41、r、 DMA、 中断等 都是资源。 在系统中各种资源围绕什么进行操作呢? 是数据。 数据可以加上不同的限制条件, 换句 话说数据可以组织成不同的形式。 数据经由不同的模块处理可以理解为数据在不同的模块之 间流动, 笔者称之为数据流。 数据流经过相邻两个模块时, 双方要知道数据是如何组织的, 从而才能形成接口。 系统的设计与实现中一定要有数据流的概念还要明确接口的数据组织形 式。 这样才更容易理解系统是如何运作的, 以设计出更好的系统。 另外当不同的实体共享数 据时, 需要对共享数据进行保护, 避免不同实体同时访问共享数据, 这个保护区域就是临界 区, 保护方法是加锁。 对处理器这一资源的使用要

42、有执行实体的概念, 执行实体的运行受处理器的执行级别和 运行状态的影响, 软件通常是通过不同的栈来区分级别 (如进程栈和中断栈), Linux 内核 中断实现是借用当前进程的内核栈来执行。 不同的执行实体与处理器的执行级别和状态一起 形成上下文的概念。 不同的上下文在临界区时需要不同级别的锁。 其次对需求的实现方法通常有同步、 异步两种方式, 需要注意的是同步、 异步概念在软 件和硬件上是不同的。 软件中同步是指发送方发出数据后, 等接收方发回响应以后才发下一 个数据包的通信方式; 异步是指发送方发出数据后, 不等接收方发回响应, 接着发送下个数 据包的通信方式。 硬件中同步信号和时钟信号有关

43、, 实际上输入信号和时钟信号进行了与运 算或与非运算, 输入信号和时钟信号的运算结果为有效状态时, 器件的状态才会改变; 异步 输入信号和时钟信号无关, 输入信号变为有效状态时, 器件的状态就会立即改变。 可见软件 和硬件对同步、 异步的理解所站的立场不同, 软件站在发送者的立场, 硬件则是站在接收者 如何确认数据有效的立场, 这与软件和硬件的不同特点是分不开的。 这些概念我们要有, 并 且需要在驱动的设计与实现中随时站在不同的立场上考虑问题。 需要注意: 软件、 硬件的同 步、 异步的概念虽然有区别, 但是也有关联。 比如软件中, 异步概念的实现很多时候是通过 硬件的异步事件 (如中断) 来

44、实现的。 在实现需求时还要考虑时间、 空间的概念。 这里时间主要是性能需求, 空间主要是对存 储资源的占用。 计算机专业的学生经常会听到老师讲 “时间换空间, 空间换时间”, 这句话 体现了效率和资源之间置换的思想, 如果想提高效率通常就要多占用资源, 相应的如果资源 是瓶颈就要牺牲效率。 所以在系统设计实现中一定要首先搞清楚效率和资源的关系, 如果本 末倒置, 系统必定失败。 Linux 内核在设计过程中这些都已考虑在其中, 这也就提升了它的 适用范围。 7 最后, 软件实现需要进行抽象。 抽象是人类的一个重要思维能力, 从某种角度来说软件 系统是对各种概念或者行为进行抽象, 并加以管理。 抽象在系统设计中主要体现在将共性提 取形成概念, 抽象的概念通常包括属性及其相应的行为, 这在内核的设计中处处可见, 比如 file 结构为各种文件的抽象。 各种硬件资

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/环境 > 建筑资料


经营许可证编号:宁ICP备18001539号-1