Linux设备驱动开发

Linux设备驱动开发"

作者:[美]约翰·马德奥著李强译
ISBN:9787302619024
定价:¥149
字数:千字
页数:
出版时间:2022.12.01
开本:
版次:1-1
装帧:
出版社:清华大学出版社
简介

《Linux设备驱动开发》本书详细阐述了与Linux设备驱动开发相关的基本解决方案,主要包括Linux内核概念、regmap API应用、MFD子系统和syscon API、通用时钟框架、ALSA SoC框架、V4L2和视频采集、集成V4L2异步和媒体控制器框架、V4L2 API、Linux内核电源管理、PCI设备驱动、NVMEM框架、看门狗设备驱动、Linux内核调试技巧和**实践等内容。此外,本书还提供了相应的示例、代码,以帮助读者进一步理解相关方案的实现过程。

本书适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学用书和参考手册。

本书详细阐述了与Linux设备驱动开发相关的基本解决方案,主要包括Linux内核概念、regmap API应用、MFD子系统和syscon API、通用时钟框架、ALSA SoC框架、V4L2和视频采集、集成V4L2异步和媒体控制器框架、V4L2 API、Linux内核电源管理、PCI设备驱动、NVMEM框架、看门狗设备驱动、Linux内核调试技巧和**实践等内容。此外,本书还提供了相应的示例、代码,以帮助读者进一步理解相关方案的实现过程。

本书适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学用书和参考手册。

前言

前    言

Linux是世界上发展最快的操作系统之一,在过去的几年里,Linux内核得到了显著的发展,可以支持各种嵌入式设备,其子系统也得到了改进,并增加了许多新功能。

本书提供了有关Linux内核主题的较为全面的讨论(例如,市面图书中通常较少涉及的视频和音频框架,本书也有专门章节进行介绍)。我们将深入研究一些最复杂和最具影响力的Linux内核框架,如PCI、用于SoC的ALSA和Video4Linux2(V4L2),并在此过程中提供了一些专业技巧提示和最佳实践。

除此之外,本书还将讨论如何利用NVMEM和Watchdog(看门狗)等框架,以及如何处理特殊设备类型,如多功能设备(multi-function device,MFD)等。

通读本书之后,相信你能够编写非常实用可靠的设备驱动程序,并将它们与一些最复杂的Linux内核框架集成,包括V4L2和ALSA SoC。

本书读者

本书主要面向嵌入式爱好者和开发人员、Linux系统管理员和内核黑客。无论你是软件开发人员、系统架构师还是制造商(电子爱好者),只要你希望深入了解Linux驱动程序开发,那么本书就适合你。

内容介绍

本书共分为3篇14章,具体内容如下。

  第1篇为“用于嵌入式设备驱动程序开发的内核核心框架”,包括第1~4章。

  第1章为“嵌入式开发人员需要掌握的Linux内核概念”,详细介绍了内核锁API,Linux内核中的等待、感知和阻塞,工作延迟机制和Linux内核中断管理等。

  第2章为“regmap API应用”,简要介绍了regmap及其数据结构、regmap和IRQ管理、链接IRQ、regmap IRQ API和数据结构等,并演示了如何利用regmap API来简化中断管理和抽象寄存器访问。

  第3章为“深入研究MFD子系统和syscon API”,重点介绍了Linux内核中的MFD驱动程序及其API和结构,并讨论了syscon和simple-mfd辅助函数。

  第4章为“通用时钟框架”,详细解释了Linux内核时钟框架,并探讨了生产者和使用者设备驱动程序,以及它们的设备树绑定。

  第2篇为“嵌入式Linux系统中的多媒体和节能”,包括第5~10章。

  第5章为“ALSA SoC框架—利用编解码器和平台类驱动程序”,讨论了编解码器和平台设备的ALSA驱动程序开发,并介绍了kcontrol和数字音频电源管理(digital audio power management,DAPM)等概念。

  第6章为“ALSA SoC框架—深入了解机器类驱动程序”,深入研究了 ALSA机器类驱动程序开发,并展示了如何将编解码器和平台绑定在一起以及如何定义音频路由。

  第7章为“V4L2和视频采集设备驱动程序揭秘”,描述了V4L2的关键概念。本章侧重于桥接视频设备,介绍了子设备的概念,并涵盖了它们各自的设备驱动程序。

  第8章为“集成V4L2异步和媒体控制器框架”,详细介绍了异步探测的概念,这样你就不必关心桥接设备和子设备探测顺序。此外,本章还介绍了媒体控制器框架,以提供自定义的视频路由和视频管道。

  第9章为“从用户空间利用V4L2 API”,逐一枚举和介绍了用户空间V4L2 API。本章首先讨论了如何编写C语言代码,以便从视频设备中打开、配置和获取数据,然后演示了如何通过用户空间视频相关工具(如v4l2-ctl和media-ctl)来编写尽可能少的代码。

  第10章为“Linux内核电源管理”,讨论了基于Linux系统的电源管理,并介绍了如何编写具有功耗意识的设备驱动程序。

  第3篇为“与其他Linux内核子系统保持同步”,包括第11~14章。

  第11章为“编写PCI设备驱动程序”,详细阐释了PCI子系统并介绍了其Linux内核的实现。本章还演示了如何编写PCI设备驱动程序。

  第12章为“利用NVMEM框架”,描述了Linux非易失性内存(Non-Volatile Memory,NVEM)子系统。本章阐释了如何编写提供者和使用者驱动程序以及它们的设备树绑定,并展示了如何从用户空间利用此类设备。

  第13章为“看门狗设备驱动程序”,提供了对Linux内核看门狗子系统的准确描述。本章首先介绍了看门狗设备驱动程序,然后逐步阐释了子系统的核心,讨论了一些关键概念(如预超时和调控器)。最后,还介绍了如何从用户空间管理子系统。

  第14章为“Linux内核调试技巧和最佳实践”,重点介绍了使用Linux内核嵌入式工具(如 Ftrace和oops消息分析)最常用的Linux内核调试和跟踪技术。

充分利用本书

为了充分利用本书,你需要一些C语言和系统编程知识。此外,本书内容组织基于假设你熟悉Linux系统及其大部分基本命令。

本书软硬件和操作系统需求如表P-1所示。

表P-1  本书操作系统需求

本书涵盖的软硬件 操作系统需求

一台具有良好网络带宽和足够磁盘空间和内存的计算机,可下载和构建Linux内核 最好是任何基于Debian的发行版

市场上的任何Cortex-A嵌入式板(如Udoo、Raspberry Pi和BeagleBone) Yocto/Buildroot或任何特定于供应商的操作系统

表P-1中未列出的任何必要软件包将在具体章节中介绍。

下载彩色图像

我们还提供了一个PDF文件,其中包含本书中使用的屏幕截图/图表的彩色图像。可以通过以下地址下载:

http://www.packtpub.com/sites/default/files/downloads/9781789342048_ColorImages.pdf

本书约定

本书中使用了许多文本约定。

(1)Code In Text:表示文本中的代码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入和Twitter句柄等。以下段落就是一个示例:

以下链接可能有助于你了解可能的值:

https://linuxtv.org/downloads/v4l-dvb-apis/userspace-api/

mediactl/media-types.html

(2)有关代码块的设置如下所示:

static int fake_probe( struct i2c_client *client,

const struct i2c_device_id *id)

{

     [...]

    mutex_init(&data->mutex); 

     [...]

}

(3)当我们希望让你注意代码块的特定部分时,相关行或项目以粗体字给出:

static int __init my_init(void) 

{

    pr_info('Wait queue example\n'); 

    INIT_WORK(&wrk, work_handler); 

    schedule_work(&wrk);

    pr_info('Going to sleep %s\n', __FUNCTION__);

    wait_event_interruptible(my_wq, condition != 0);

    pr_info('woken up by the work job\n');

    return 0;

}

(4)任何命令行输入或输出都采用如下所示的粗体代码形式:

# echo 1 >/sys/module/printk/parameters/time

# cat /sys/module/printk/parameters/time

(5)术语或重要单词采用中英文对照形式,在括号内保留其英文原文。示例如下:

随着时间的推移,媒体支持已成为系统级芯片(System on Chip,SoC)的必需品和销售卖点,它变得越来越复杂。这些媒体IP核心的复杂性使得获取传感器数据需要由软件设置整个管道(由多个子设备组成)。基于设备树的系统的异步特性意味着这些子设备的设置和探测并不简单,异步框架(Async Framework)由此应运而生。

(6)本书还使用了以下两个图标。

 表示警告或重要的注意事项。

 表示提示或小技巧。

目录

目    录

第1篇  用于嵌入式设备驱动程序开发的内核核心框架

第1章  嵌入式开发人员需要掌握的Linux内核概念 3

1.1  技术要求 3

1.2  内核锁API和共享对象 3

1.2.1  自旋锁 4

1.2.2  禁用中断与仅禁用抢占 8

1.2.3  互斥锁 8

1.2.4  try-lock方法 11

1.3  Linux内核中的等待、感知和阻塞 13

1.3.1  等待活动完成或状态改变 13

1.3.2  Linux内核等待队列 15

1.4  工作延迟机制 19

1.4.1  softIRQ 20

1.4.2  关于ksoftirqd 24

1.4.3  tasklet 25

1.4.4  工作队列 28

1.4.5  内核共享队列 31

1.4.6  新的工作队列 32

1.4.7  并发管理的工作队列 33

1.5  Linux内核中断管理 37

1.5.1  中断的状态 37

1.5.2  中断处理流程 38

1.5.3  设计中断处理程序 40

1.5.4  中断的标志 42

1.5.5  中断的返回值 44

1.5.6  关于中断的一些注意事项 45

1.5.7  上半部和下半部的概念 46

1.5.8  线程中断处理程序 48

1.5.9  请求一个上下文中断 53

1.5.10  使用工作队列延迟下半部 55

1.5.11  从中断处理程序中锁定 58

1.6  小结 61

第2章  regmap API应用 63

2.1  技术要求 63

2.2  regmap及其数据结构 64

2.2.1  struct regmap_config结构体中的字段 65

2.2.2  访问设备寄存器 69

2.2.3  一次读/写多个寄存器 71

2.2.4  更新寄存器中的位 72

2.3  regmap和IRQ管理 73

2.3.1  Linux内核IRQ管理的结构 73

2.3.2  创建映射 74

2.3.3  struct irq_domain_ops 76

2.3.4  irq_domain_ops.map() 77

2.3.5  irq_domain_ops.xlate() 77

2.4  链接IRQ 78

2.4.1  链式中断 78

2.4.2  嵌套中断 83

2.4.3  irqchip和gpiolib API—新一代 85

2.4.4  基于gpiochip的链式IRQ芯片 87

2.4.5  基于gpiochip的嵌套IRQ芯片 89

2.5  regmap IRQ API和数据结构 91

2.5.1  regmap IRQ数据结构 91

2.5.2  regmap IRQ API 95

2.5.3  regmap IRQ API示例 98

2.6  小结 102

第3章  深入研究MFD子系统和syscon API 103

3.1  技术要求 103

3.2  MFD子系统和syscon API 104

3.2.1  da9055设备驱动程序示例 104

3.2.2  max8925设备驱动程序示例 113

3.3  MFD设备的设备树绑定 116

3.4  了解syscon和simple-mfd 119

3.4.1  syscon API 119

3.4.2  simple-mfd 123

3.5  小结 125

第4章  通用时钟框架 127

4.1  技术要求 128

4.2  CCF数据结构和接口 128

4.2.1  了解struct clk_hw及其依赖项 129

4.2.2  注册/取消注册时钟提供者 131

4.2.3  将时钟公开给使用者 135

4.2.4  时钟提供者设备树节点及其相关机制 136

4.2.5  了解of_parse_phandle_with_args() API 138

4.2.6  了解__of_clk_get_from_provider() API 140

4.2.7  时钟解码回调 141

4.3  编写时钟提供者驱动程序 145

4.3.1  有关时钟提供者驱动程序的基础知识 145

4.3.2  提供时钟操作 149

4.3.3  clk_hw.init.flags中的时钟标志 152

4.3.4  固定频率时钟案例研究及其操作 154

4.3.5  通用简化注意事项 156

4.3.6  固定频率时钟设备绑定 158

4.3.7  PWM时钟 159

4.3.8  固定倍频时钟驱动程序及其操作 160

4.3.9  固定倍频时钟的设备树绑定 162

4.3.10  门控时钟及其操作 162

4.3.11  基于I2C/SPI的门控时钟 164

4.3.12  GPIO门控时钟 165

4.3.13  多选一时钟及其操作 165

4.3.14  基于I2C/SPI的多选一时钟 170

4.3.15  GPIO多选一时钟 170

4.3.16  分频器时钟及其操作 172

4.3.17  复合时钟及其操作 176

4.3.18  综合概述 177

4.4  时钟使用者API 179

4.4.1  获取和释放时钟 180

4.4.2  准备/取消准备时钟 180

4.4.3  启用/禁用 181

4.4.4  频率函数 181

4.4.5  父函数 182

4.4.6  综合概述 182

4.5  小结 182

第2篇  嵌入式Linux系统中的多媒体和节能

第5章  ALSA SoC框架—利用编解码器和平台类驱动程序 185

5.1  技术要求 186

5.2  ASoC简介 186

5.2.1  ASoC数字音频接口 187

5.2.2  ASoC子元素 187

5.3  编写编解码器类驱动程序 189

5.3.1  编解码器驱动程序的实例结构 190

5.3.2  编解码器DAI和PCM配置 192

5.3.3  DAI操作 193

5.3.4  采集和回放硬件配置 196

5.3.5  控件的概念 197

5.3.6  控件命名约定 199

5.3.7  控制元数据 200

5.3.8  定义kcontrol 200

5.3.9  设置一个简单开关 202

5.3.10  设置带有音量级别的开关 203

5.3.11  立体声控件 203

5.3.12 带音量级别的立体声控件 203

5.3.13  混音器控件 204

5.3.14  定义有多个输入的控件 204

5.4  DAPM概念 205

5.4.1  关于widget 205

5.4.2  定义widget 207

5.4.3  编解码域定义 207

5.4.4  定义平台域widget 208

5.4.5  定义音频路径域widget 209

5.4.6  定义音频流域 211

5.4.7  路径的概念—widget之间的连接器 213

5.4.8  路由的概念—widget互连 214

5.4.9  定义DAPM kcontrol 215

5.4.10  创建widget和路由 217

5.5  编解码器组件注册 222

5.6  编写平台类驱动程序 224

5.6.1  CPU DAI驱动程序 225

5.6.2  平台DMA驱动程序 226

5.6.3  音频DMA接口 227

5.6.4  PCM硬件配置 230

5.7  小结 233

第6章  ALSA SoC框架—深入了解机器类驱动程序 235

6.1  技术要求 235

6.2  机器类驱动程序介绍 236

6.2.1  机器类驱动程序的开发流程 236

6.2.2  DAI链接 237

6.2.3  获取CPU和编解码器节点 239

6.3  机器路由 241

6.3.1  编解码器引脚 241

6.3.2  板卡接口 242

6.3.3  机器路由 243

6.3.4  设备树路由 243

6.3.5  静态路由 244

6.4  时钟和格式注意事项 245

6.4.1  时钟和格式设置辅助函数 245

6.4.2  格式 246

6.4.3  时钟源 247

6.4.4  时钟分频器 247

6.4.5  时钟和格式设置的典型实现 247

6.5  声卡注册 249

6.6  利用simple-card机器驱动程序 252

6.6.1  simple-audio机器驱动程序 252

6.6.2  无编解码器声卡 253

6.7  小结 254

第7章  V4L2和视频采集设备驱动程序揭秘 255

7.1  技术要求 255

7.2  框架架构和主要数据结构 255

7.2.1  V4L2架构简介 256

7.2.2  初始化和注册V4L2设备 257

7.3  桥接视频设备驱动程序 258

7.3.1  struct video_device结构体 259

7.3.2  初始化和注册视频设备 262

7.3.3  视频设备文件操作 264

7.3.4  V4L2 ioctl处理 267

7.3.5  videobuf2接口和API 269

7.3.6  缓冲区的概念 269

7.3.7  平面的概念 271

7.3.8  队列的概念 272

7.3.9  与特定驱动程序相关的流传输回调函数 274

7.3.10  初始化和释放vb2队列 277

7.4  关于子设备 278

7.4.1  子设备数据结构体 279

7.4.2  子设备初始化 282

7.4.3  子设备操作 284

7.4.4  核心操作结构 285

7.4.5  视频操作结构 286

7.4.6  传感器操作结构 287

7.4.7  调用子设备操作 288

7.4.8  子设备的注册和注销方式 289

7.5  V4L2控件基础结构 290

7.5.1  标准控件对象 290

7.5.2  控件处理程序 292

7.5.3  摄像头传感器驱动程序示例 294

7.5.4  关于控件继承 297

7.6  小结 297

第8章  集成V4L2异步和媒体控制器框架 299

8.1  技术要求 299

8.2  V4L2异步接口和图绑定的概念 299

8.2.1  图绑定 300

8.2.2  端口和端点表示 300

8.2.3  端点链接 301

8.2.4  V4L2异步和面向图的API 302

8.2.5  从设备树API到通用fwnode图API 302

8.2.6  V4L2固件节点API 309

8.2.7  V4L2 fwnode或媒体总线类型 311

8.2.8  BT656和并行总线 312

8.2.9  MIPI CSI-2总线 313

8.2.10  CPP2和MIPI CSI-1总线 314

8.2.11  总线猜测 315

8.2.12  V4L2异步模式 315

8.2.13  异步模式工作原理 318

8.2.14  异步桥接和子设备探测示例 321

8.3  Linux媒体控制器框架 325

8.3.1  媒体控制器抽象模型 325

8.3.2  V4L2设备抽象 327

8.3.3  媒体控制器数据结构 328

8.3.4  在驱动程序中集成媒体控制器支持 333

8.3.5  初始化并注册接口和实体 334

8.3.6  媒体实体操作 335

8.3.7  媒体总线的概念 335

8.3.8  注册媒体设备 340

8.3.9  来自用户空间的媒体控制器 341

8.3.10  使用media-ctl 341

8.3.11  带有OV2680的WaRP7示例 344

8.4  小结 351

第9章  从用户空间利用V4L2 API 353

9.1  技术要求 353

9.2  从用户空间看V4L2 353

9.2.1  V4L2用户空间API 353

9.2.2  常用ioctl命令 354

9.2.3  在用户空间中使用V4L2 API的示例 356

9.3  视频设备打开和属性管理 357

9.3.1  打开和关闭设备 357

9.3.2  查询设备功能 357

9.4  缓冲区管理 359

9.4.1  图像(缓冲区)格式 360

9.4.2  请求缓冲区 364

9.4.3  请求用户指针缓冲区 364

9.4.4  请求内存可映射缓冲区 366

9.4.5  请求DMABUF缓冲区 367

9.4.6  请求读/写I/O内存 369

9.4.7  将缓冲区加入队列并启用流传输 369

9.4.8  主缓冲区的概念 370

9.4.9  将用户指针缓冲区加入队列 370

9.4.10  将内存可映射缓冲区加入队列 371

9.4.11  将DMABUF缓冲区加入队列 371

9.4.12  启用流传输 372

9.4.13  将缓冲区移出队列 373

9.4.14  将内存映射缓冲区移出队列 373

9.4.15  将用户指针缓冲区移出队列 375

9.4.16  读/写I/O 376

9.5  V4L2用户空间工具 376

9.5.1  关于v4l2-ctl 376

9.5.2  列出视频设备及其功能 377

9.5.3  更改设备属性 377

9.5.4  设置像素格式、分辨率和帧速率 379

9.5.5  采集帧和流传输 380

9.6  在用户空间中调试V4L2 382

9.6.1  启用框架调试 382

9.6.2  V4L2合规性驱动程序测试 384

9.7  小结 385

第10章  Linux内核电源管理 387

10.1  技术要求 387

10.2  基于Linux系统的电源管理概念 388

10.2.1  运行时电源管理 389

10.2.2  动态电源管理接口 389

10.3  主要电源管理框架详解 389

10.3.1  CPU Idle框架 389

10.3.2  CPUFreq框架 392

10.3.3  Thermal框架 394

10.4  系统电源管理休眠状态 395

10.4.1  挂起到空闲 395

10.4.2  通电待机 396

10.4.3  挂起到内存 396

10.4.4  挂起到磁盘 397

10.5  为设备驱动程序添加电源管理功能 399

10.5.1  设备和电源管理操作数据结构 399

10.5.2  实现运行时电源管理功能 401

10.5.3  驱动程序中的运行时电源管理 402

10.5.4  运行时电源管理的同步和异步操作 404

10.5.5  自动挂起 404

10.6  综合应用 405

10.6.1  probe函数中的电源管理机制 405

10.6.2  读取函数中的电源管理调用 407

10.6.3  卸载模块时的电源管理方法 409

10.6.4  运行时电源管理回调函数执行的一般规则 410

10.6.5  电源域的概念 410

10.7  系统挂起和恢复顺序 411

10.7.1  挂起阶段 411

10.7.2  恢复阶段 412

10.7.3  实现系统休眠功能 412

10.8  系统唤醒源 415

10.8.1  唤醒源的数据结构 415

10.8.2  使设备成为唤醒源 417

10.8.3  唤醒功能激活实例 418

10.8.4  IRQ处理程序 419

10.8.5  唤醒源和sysfs 421

10.8.6  关于IRQF_NO_SUSPEND标志 422

10.9  小结 422

第3篇  与其他Linux内核子系统保持同步

第11章  编写PCI设备驱动程序 425

11.1  技术要求 425

11.2  PCI总线和接口介绍 426

11.2.1  术语 427

11.2.2  PCI总线枚举、设备配置和寻址 428

11.2.3  设备识别 428

11.2.4  总线枚举 428

11.3  PCI地址空间 432

11.3.1  PCI配置空间 432

11.3.2  PCI I/O地址空间 433

11.3.3  PCI内存地址空间 433

11.4  BAR的概念 433

11.5  中断分配 434

11.5.1  PCI传统INT-X中断 434

11.5.2  基于消息的中断类型 435

11.5.3  MSI机制 436

11.5.4  MSI-X机制 437

11.5.5  传统INTx模拟 437

11.6  Linux Kernel PCI子系统 438

11.7  PCI数据结构 439

11.7.1  实例化PCI设备的结构体 439

11.7.2  用于识别PCI设备的结构体 441

11.7.3  实例化PCI设备驱动程序的结构体 443

11.7.4  注册PCI驱动程序 444

11.8  PCI驱动程序结构体概述 445

11.8.1  启用设备 445

11.8.2  总线控制能力 446

11.8.3  访问配置寄存器 447

11.8.4  访问内存映射I/O资源 448

11.8.5  访问I/O端口资源 451

11.8.6  处理中断 453

11.8.7  传统INTx IRQ分配 455

11.8.8  模拟INTx IRQ调和 457

11.8.9  关于锁定的注意事项 457

11.8.10  关于传统API的简要说明 457

11.9  PCI和直接内存访问 458

11.9.1  关于DMA缓冲区 459

11.9.2  PCI一致DMA映射 460

11.9.3  流式DMA映射 462

11.9.4  单缓冲区映射 462

11.9.5  分散/聚集映射 464

11.10  小结 466

第12章  利用NVMEM框架 467

12.1  技术要求 467

12.2  NVMEM数据结构和API 468

12.2.1  NVMEM硬件抽象数据结构 468

12.2.2  NVMEM设备的运行时配置数据结构 468

12.2.3  NVMEM数据单元的数据结构 470

12.3  编写NVMEM提供者驱动程序 472

12.3.1  NVMEM设备的注册和注销 472

12.3.2  实时时钟设备中的NVMEM存储器 473

12.3.3  DS1307实时时钟驱动程序示例 474

12.3.4  实现NVMEM读/写回调函数 475

12.3.5  NVMEM提供者的设备树绑定 476

12.4  NVMEM使用者驱动程序API 477

12.4.1  NVMEM使用者API 477

12.4.2  用户空间中的NVMEM 478

12.5  小结 480

第13章  看门狗设备驱动程序 481

13.1  技术要求 481

13.2  看门狗数据结构和API 481

13.2.1  表示看门狗设备的结构体 482

13.2.2  表示看门狗信息的结构体 483

13.2.3  表示看门狗操作的结构体 485

13.2.4  注册/注销看门狗设备 486

13.2.5  处理预超时和调控器 488

13.2.6  基于GPIO的看门狗 489

13.3  看门狗用户空间接口 491

13.3.1  启动和停止看门狗 491

13.3.2  发送保持活动的ping 492

13.3.3  获取看门狗的功能和ID 493

13.3.4  设置和获取超时和预超时 493

13.3.5  获取剩余的时间 494

13.3.6  获取(启动/重启)状态 494

13.3.7  看门狗sysfs接口 496

13.3.8  处理预超时事件 497

13.4  小结 497

第14章  Linux内核调试技巧和最佳实践 499

14.1  技术要求 499

14.2  了解Linux内核发布流程 499

14.3  Linux内核开发技巧 501

14.3.1  消息打印 502

14.3.2  内核日志级别 502

14.3.3  内核日志缓冲区 504

14.3.4  添加计时信息 505

14.4  Linux内核跟踪和性能分析 506

14.4.1  使用Ftrace检测代码 506

14.4.2  可用的tracer 508

14.4.3  function tracer 509

14.4.4  function_graph tracer 510

14.4.5  函数过滤器 512

14.4.6  跟踪事件 513

14.4.7  使用Ftrace接口跟踪特定进程 515

14.5  Linux内核调试技巧 516

14.5.1  oops和恐慌分析 516

14.5.2  转储oops跟踪消息 519

14.5.3  使用objdump识别内核模块中的错误代码行 520

14.6  小结 521

 

作者简介

编辑推荐

《Linux设备驱动开发》提供了有关Linux内核主题的较为全面的讨论(例如,市面图书中通常较少涉及的视频和音频框架,本书也有专门章节进行介绍)。我们将深入研究一些最复杂和**影响力的Linux内核框架,如PCI、用于SoC的ALSA和Video4Linux2(V4L2),并在此过程中提供了一些专业技巧提示和**实践。

作者寄语

约翰·马德奥现居住在法国巴黎,他是一位嵌入式Linux和内核工程师。他的主要工作包括为物联网、自动化、运输、医疗保健、能源和军事等领域的公司开发设备驱动程序和板级支持包(Board Support Package,BSP)。John是LABCSMART公司的创始人兼首席顾问,该公司可为嵌入式Linux和Linux内核工程提供培训和服务。他是一位开源和嵌入式系统爱好者,始终坚信只有分享知识,我们才能学到更多。

电子资料

www.luweidong.cn

下一个