这是一本系统剖析SoC底层软件低功耗系统设计、实现与定制化的著作,同时它还全面讲解了低功耗的知识点以及各种低功耗问题的定位与优化。作者在华为海思等半导体企业深耕低功耗领域10余年,本书内容基于作者的实际商用经验撰写而成,读完本书后,我们至少能掌握以下知识:(1)Linux内核中所有与低功耗相关的17个模块的设计与实现原理,以及这些模块的自定义实现和二次开发,这部分内容能让读者对低功耗相关的问题知其然并知其所以然。(2)Linux内核中关于低功耗的设计思想,既同时适用于宏内核、微内核和精简内核,又可以给其他的操作系统提供思路和启发。(3)低功耗的20余个扩展知识点,让读者对低功耗有更全面、更深入地了解。(4)各种低功耗问题的定位方法和通用优化手段。
(1)作者背景权威:作者是资深的SoC低功耗专家,曾在华为海思半导体担任高级工程师,现为国内某头部手机厂商的高级工程师。(2)作者经验丰富:作者在驱动开发、低功耗、性能优化、系统稳定性等多个领域有丰富经验,相关工作支撑各类终端产品累计近十亿级发货总量。(3)内容实操性强:内容聚焦于SoC底层软件的低功耗问题,既有Linux内核的低功耗模块的设计、实现与定制化,又有各种常见低功耗问题的定位与优化。(4)表达通俗易懂:图文并茂、抽丝剥茧,对Linux内核中低功耗模块的源码进行分析和介绍时,绘制了大量的流程图、时序图,层层展开,便于读者理解。
Preface 前 言
在SoC芯片的整个交付过程中,低功耗的芯片设计、软件设计、功耗优化是非常重要的细分领域,而低功耗软件领域的书却相对匮乏,已有的相关图书也更多集中在芯片设计领域。一些想要从事低功耗领域相关工作的研发人员需要工作很长一段时间才能对低功耗软件框架及其问题分析和优化有一个全局的认识。这是我想要出版这本书的主要原因,此外,我也想让更多的人熟悉低功耗特性及软件设计。
综合来说,本书主要讲了四点:
一是分析Linux 内核的实现机制和方法,希望能给初次涉足低功耗领域的软件开发人员一些帮助。这一内容分布在各章中。
二是学习优秀的设计思想,从而以其为参考将我们自己对应的机制应用到其他操作系统中。这一内容同样分布在各章中。
三是对低功耗领域涉及的一些扩展知识点做了补充说明。这一内容主要在第18章中体现。
四是针对低功耗问题定位和优化手段做了一些简单说明。这一内容在第19章中阐述。这一部分与各芯片厂商关系很大,因此这里只能介绍一些通用的优化手段。
特别需要说明的是,本书的第12~15章是在本领域资深专家杨强的指导下完成的,在此特别表示感谢。
内核版本
本书基于Linux 内核 5.10.111撰写,并对基于该版本的相关实现进行了代码分析,大家可以到内核官方网站(https://kernel.org/)中下载、查阅相关实现。不过对于低功耗机制来讲,不同版本的相关实现基本不会有太大变化。
读者对象
本书适合有志于在低功耗领域发展的开发者阅读,包括但不限于BSP工程师、内核开发工程师、RTOS开发工程师、系统软件工程师、固件工程师、低功耗测试工程师等。我们会假定阅读本书的开发者都有一定的技术基础。
错误或建议反馈
由于作者水平有限,书中难免会有不准确的地方,欢迎大家积极反馈,也欢迎大家提出改进建议。读者可通过邮件与我联系:2118216214@qq.com。
Contents 目 录
前言
第1章 低功耗系统设计思路1
1.1 低功耗系统设计面临的挑战1
1.2 降低功耗的3种主要设计思路2
1.3 低功耗系统的架构设计3
1.4 术语介绍6
1.5 本章小结8
第2章 wakeup source 框架设计与实现9
2.1 Linux wakeup source的设计与实现9
2.1.1 架构设计概览9
2.1.2 模块功能详解9
2.1.3 配置信息解析10
2.1.4 主要数据结构10
2.1.5 主要函数分析12
2.1.6 函数工作时序17
2.2 实现自己的wakeup source 框架18
2.2.1 动手前的思考18
2.2.2 设计与实现19
2.3 本章小结22
第3章 autosleep 框架设计与实现23
3.1 Linux autosleep的设计与实现23
3.1.1 架构设计概览23
3.1.2 模块功能详解23
3.1.3 配置信息解析24
3.1.4 主要函数实现24
3.1.5 函数工作时序27
3.2 实现自己的autosleep 框架28
3.2.1 动手前的思考28
3.2.2 设计与实现29
3.3 本章小结30
第4章 PM Core框架设计与实现31
4.1 Linux PM Core的设计与实现31
4.1.1 架构设计概览31
4.1.2 模块功能详解31
4.1.3 配置信息解析32
4.1.4 主要数据结构32
4.1.5 主要函数实现35
4.1.6 软件处理流程41
4.2 实现自己的PM Core 框架43
4.2.1 动手前的思考43
4.2.2 运行时序设计44
4.2.3 设计与实现44
4.3 本章小结47
第5章 notifier 框架设计与实现48
5.1 Linux notifier的设计与实现48
5.1.1 架构设计概览48
5.1.2 模块功能详解48
5.1.3 配置信息解析49
5.1.4 主要数据结构49
5.1.5 主要接口介绍50
5.1.6 内核使用场景54
5.2 实现自己的notifier 框架57
5.2.1 动手前的思考57
5.2.2 设计与实现57
5.3 本章小结59
第6章 DPM 框架设计与实现60
6.1 Linux DPM的设计与实现60
6.1.1 架构设计概览60
6.1.2 模块功能详解60
6.1.3 配置信息解析61
6.1.4 主要数据结构61
6.1.5 主要函数介绍63
6.1.6 函数工作时序67
6.2 实现自己的DPM框架75
6.2.1 动手前的思考75
6.2.2 设计与实现75
6.3 补充说明79
6.4 本章小结81
第7章 syscore 框架设计与实现82
7.1 Linux syscore的设计与实现82
7.1.1 架构设计概览82
7.1.2 模块功能详解82
7.1.3 配置信息解析82
7.1.4 主要结构体介绍83
7.1.5 主要函数介绍84
7.2 实现自己的syscore 框架87
7.2.1 动手前的思考88
7.2.2 设计与实现88
7.3 本章小结90
第8章 RPM框架设计与实现91
8.1 Linux RPM的设计与实现91
8.1.1 架构设计概览91
8.1.2 模块功能详解91
8.1.3 RPM与system sleep的关系94
8.1.4 No-Callback设备解析95
8.1.5 autosuspend与automatically-
delayed suspends分析95
8.1.6 配置信息解析96
8.1.7 主要结构体介绍96
8.1.8 主要函数介绍99
8.1.9 RPM与PM Core工作时间段
对比108
8.1.10 RPM的函数工作时序108
8.2 实现自己的RPM 框架112
8.2.1 动手前的思考112
8.2.2 设计与实现112
8.2.3 实现进阶步114
8.2.4 实现进阶第二步116
8.2.5 实现进阶第三步118
8.3 本章小结120
第9章 thermal框架设计与实现121
9.1 Linux thermal的设计与实现121
9.1.1 架构设计概览121
9.1.2 模块功能详解121
9.1.3 基本术语概念123
9.1.4 配置信息解析123
9.1.5 thermal_core解析123
9.1.6 关于critical事件和非critical
事件的处理流程133
9.1.7 governor实现介绍134
9.2 实现自己的thermal框架135
9.2.1 动手前的思考136
9.2.2 设计与实现136
9.3 本章小结143
第10章 CPU Hotplug框架设计
与实现144
10.1 Linux CPU Hotplug的设计与实现144
10.1.1 架构设计概览144
10.1.2 模块功能详解144
10.1.3 配置信息解析145
10.1.4 主要数据结构介绍146
10.1.5 如何使用CPU Hotplug148
10.1.6 CPU Hotplug?状态机149
10.1.7 CPU online/offline运行流程
示意150
10.1.8 state申请及使用152
10.1.9 CPU Hotplug工作时序153
10.2 实现自己的Hotplug 框架157
10.2.1 动手前的思考157
10.2.2 设计与实现157
10.3 本章小结160
第11章 CPUIdle 框架设计与实现161
11.1 Linux CPUIdle的设计与实现161
11.1.1 架构设计概览161
11.1.2 背景介绍161
11.1.3 配置信息解析162
11.1.4 设计与实现163
11.2 实