目录
图3.2 Linux 2.4和2.6以后的内核在抢占上的区别
图8.2 wait_queque_head_t、 wait_queque和task_struct之间的关系
图9.1 阻塞、 结合轮询的非阻塞I/O和异步通知的区别编辑
图11.12 DMA目的地址与Cache对象没有重叠 编辑
图13.3 request_queue、 request、 bio和bio_vec
图14.2 sk_buff的head、 data、 tail、 end指针
图15.4 i2cdev_read() 和i2cdev_write() 函数对应的时序
图19.4 Linux CPUIdle子系统的整体架构编辑
说明:
该文档所有插图均来自宋宝华老师的《linux设备驱动开发详解——-基于最新的linux4.0内核》一书。截图出来仅做平时网页查阅学习。
第一章 linux设备驱动概述及开发环境构建
图1.1 无操作系统时硬件、 设备驱动和应用软件的关系
图1.4 硬件、 驱动、 操作系统和应用程序的关系
图1.5 Linux设备驱动与整个软硬件系统的关系
第二章 驱动设计的硬件基础
图2.2 冯·诺依曼结构与哈佛结构
![](https://i-blog.csdnimg.cn/blog_migrate/cc19925e224678060c544ca7e0788121.png)
图2.3 改进的哈佛结构
图2.4 处理器分类
图2.5 典型的类SRAM接口
图2.6 双端口RAM
图2.8 存储器分类
图2.9 RS-232C串口电路原理
图2.10 I2C总线的开始位和停止位
![](https://i-blog.csdnimg.cn/blog_migrate/48d9e6cbc0c18c8fb68af90ead922d1c.png)
图2.11 I2C总线的时序
图2.12 SPI主、 从硬件连接图
图2.13 SPI总线的时序
图2.14 USB的物理拓扑结构
图2.15 以太
图2.15 以太网接口的硬件电路原理
![](https://i-blog.csdnimg.cn/blog_migrate/9d6f0bd070b657de542064184ce54393.png)
图2.16 基于PCI总线的计算机系统逻辑示意图
图2.17 PCI配置空间
![](https://i-blog.csdnimg.cn/blog_migrate/2fc3a117877a55beaf82c30b97e31f08.png)
图2.18 SDIO单模块读、 写的典型时序
图2.19 典型的CPLD的单个宏单元结构
图2.20 典型的CPLD整体架构
图2.21 典型的FPGA内部结构
第三章 linux内核及内核编程
图3.2 Linux 2.4和2.6以后的内核在抢占上的区别
图3.3 Linux内核的组成部分与关系
图3.4 Linux进程状态转换
图3.5 Linux进程地址空间
图3.6 Linux内存管理
图3.7 Linux虚拟文件系统
图3.8 Linux网络体系结构
图3.11 ARM上的Linux引导流程
第四章 linux内核模块
空
第五章 linux文件系统与设备文件
图5.1 文件系统与设备驱动之间的关系
图5.2 应用程序、 VFS与设备驱动
图5.3 Linux设备模型
第六章 字符设备驱动
图6.1 字符设备驱动的结构
![](https://i-blog.csdnimg.cn/blog_migrate/e9d3c04459fdafa217c47821c187ed53.png)
第七章 linux设备驱动中的并发控制
图7.1 并发执行单元的顺序执行
![](https://i-blog.csdnimg.cn/blog_migrate/47d685215cbfeddc45799faa38ba5acf.png)
图7.2 并发执行单元的交错执行
图7.3 SMP体系结构
图7.4 SMP下多核之间的竞态
图7.5 SMP下核间与核内竞态
图7.8 自旋锁的使用实例
![](https://i-blog.csdnimg.cn/blog_migrate/4ecea2065bee9e57cb151c420e7daa2f.png)
第八章 linux设备驱动中的阻塞与非阻塞I/O
图8.2 wait_queque_head_t、 wait_queque和task_struct之间的关系
图8.3 多路复用select()
第九章 linux设备驱动中的异步通知与异步I/O
图9.1 阻塞、 结合轮询的非阻塞I/O和异步通知的区别
![](https://i-blog.csdnimg.cn/blog_migrate/ed1f78b665356f78705f91dba9513c7d.png)
图9.2 异步通知中设备驱动和异步通知的交互
图9.3 异步I/O的时序
第十章 中断与时钟
图10.1 PIT定时器的工作原理
![](https://i-blog.csdnimg.cn/blog_migrate/b8462f950ce2c8ab43afbf86eaeaa218.png)
图10.2 ARM多核处理器里的GIC
图10.3 Linux中断处理机制
图10.5 共享中断的处理
第十一章 内存与I/O访问
图11.1 内存空间和I/O空间
图11.2 内存中的转换表
图11.3 ARM处理器的MMU
图11.4 ARM CPU进行数据访问的流程
图11.5 用户空间与内核空间
图11.6 32位x86系统Linux内核的地址空间
图11.7 32位ARM系统中Linux内核的地址空间
图11.8 DMA、 常规、 高端内存区域分布
图11.9 buddy算法
![](https://i-blog.csdnimg.cn/blog_migrate/3f77e919d7b8a78d54438de46abb1f11.png)
图11.10 I/O端口的访问流程
图11.11 I/O内存访问流程
图11.12 DMA目的地址与Cache对象没有重叠
![](https://i-blog.csdnimg.cn/blog_migrate/4a78562f203167c7542cf010e8b0e607.png)
图11.13 DMA目的地址与Cache对象有重叠
图11.14 MMU与IOMMU
第十二章 linux设备驱动的软件架构思想
图12.1 Linux设备和驱动的分离
![](https://i-blog.csdnimg.cn/blog_migrate/339cf04db51332050fda22c2e0b868fd.png)
图12.2 Linux驱动的分层
图12.3 将M∶ N耦合转化为M∶ 1∶ N耦合
图12.4 Linux设备驱动的主机、 外设驱动分离
图12.5 Linux设备驱动的分层
图12.6 Linux内核输入子系统的框架
图12.7 Linux RTC设备驱动的分层
图12.8 Linux帧缓冲设备驱动的程序结构
![](https://i-blog.csdnimg.cn/blog_migrate/c09d33327a55da1e84dc04e534b0957f.png)
图12.9 Linux内核中tty的层次结构
![](https://i-blog.csdnimg.cn/blog_migrate/baa460dd3cb8cff78a5828fe1b9114ef.png)
图12.10 tty设备发送、 接收数据流的流程
图12.11 串口核心层
图12.12 tty驱动各层泛化
![](https://i-blog.csdnimg.cn/blog_migrate/496836829fc68e56cb7e0683f87a2c80.png)
第十三章 linux块设备驱动
图13.1 调整块设备I/O操作的顺序
![](https://i-blog.csdnimg.cn/blog_migrate/ed86d96070813bab06fee8b2e42c0ca1.png)
图13.2 Linux块设备子系统
图13.3 request_queue、 request、 bio和bio_vec
图13.4 vmem_disk的I/O处理过程
图13.5 Linux MMC子系统
![](https://i-blog.csdnimg.cn/blog_migrate/66b5d72b48aca07fc02f75fb9391dc4f.png)
第十四章 网络设备驱动
图14.1 Linux网络设备驱动程序的体系结构
![](https://i-blog.csdnimg.cn/blog_migrate/c8bf9ddae5dbc75a1ac2be1711a4819a.png)
图14.2 sk_buff的head、 data、 tail、 end指针
图14.3 NAPI驱动程序各部分的调用关系
第十五章 Linux I2C核心、 总线与设备驱动
图15.1 Linux的I2C体系结构
![](https://i-blog.csdnimg.cn/blog_migrate/007f4c53ac614befbf13c730e883656f.png)
图15.2 I2C驱动的各种数据结构的关系
图15.3 master_xfer() 完成的时序
图15.4 i2cdev_read() 和i2cdev_write() 函数对应的时序
图15.5 RepStart模式
第十六章 USB主机、 设备与Gadget驱动
图16.1 Linux USB驱动总体结构
![](https://i-blog.csdnimg.cn/blog_migrate/e87f40c47b38e367e7298531ba857031.png)
图16.2 USB设备、 配置、 接口和端点
图16.4 URB处理流程
第十七章 I2C、 SPI、 USB驱动架构类比
表17.1 I2C、 SPI、 USB驱动架构的类比
![](https://i-blog.csdnimg.cn/blog_migrate/e6480235a1467d6dabdfbd9dc109c7a9.png)
图17.1 I2C主机和外设眼里的Linux世界
第十八章 ARM Linux设备树
图18.1 设备树参考硬件结构图
![](https://i-blog.csdnimg.cn/blog_migrate/8982ca7d4485ada4d6a9ff8f32ea8456.png)
图18.2 设备树的全景视图
第十九章 Linux电源管理的系统架构和驱动
图19.1 Linux内核电源管理的整体架构
![](https://i-blog.csdnimg.cn/blog_migrate/4d0caced89626de272989ee7ae2062f5.png)
图19.2 CPUFreq、 系统负载、 策略与调频
图19.3 LADDER与MENU的区别
![](https://i-blog.csdnimg.cn/blog_migrate/e15107c4caa30df24074a6085510e442.png)
图19.4 Linux CPUIdle子系统的整体架构
![](https://i-blog.csdnimg.cn/blog_migrate/7edd3da65c512ea1908be52cb96a9441.png)
图19.6 Regulator树形结构
图19.8 ARM的big.LITTLE架构
图19.9 Linux的待机模式
图19.10 Linux挂起到RAM流程
第二十章 Linux芯片级移植及底层驱动
图20.1 周期节拍的系统节拍中断发生的时序
![](https://i-blog.csdnimg.cn/blog_migrate/486d596bcffb3ad7f978b43cf87be765.png)
图20.2 NO_HZ的运行节拍
图20.3 屏蔽中断的3个不同位置
图20.4 SoC中断控制器的典型分布
图20.5 中断级联与映射
图20.6 一个典型的多核Linux启动过程
图20.7 CPU0唤醒其他CPU过程
图20.10 针对PGA封装的SoC的引脚分组
第二十一章 Linux设备驱动的调试
图21.2 DDD运行机理