作者 |
阿尔贝托·利贝拉尔·德·洛斯里奥斯 余洪春 |
丛书名 |
电子与嵌入式系统设计译丛 |
出版社 |
机械工业出版社 |
ISBN |
9782106221112 |
简要 |
简介 |
内容简介书籍计算机书籍 ---------------------------8081490 - 嵌入式Linux设备驱动程序开发指南(原书第2版)--------------------------- 嵌入式微处理器功能强大、节能和低成本与嵌入式Linux系统的灵活性结合,促使业界许多公司基于嵌入式微处理器开发出了很多新产品。本书教读者基于设备树嵌入式Linux系统如何开发设备驱动程序。读者将学习编写不同类型的Linux驱动程序,以及与内核和用户空间交互的应用程序程序接口(API)和方法。本书以实战为核心,阐述了Linux内核基础知识,将编写大约30个驱动程序并移植到三种不同的微处理器上。本书在实验部分中基于NXP i.MX7D、Microchip SAMA5D2和Broadcom BCM2837三种不同微处理器详细阐述了驱动程序的开发的实现,读者可参考实验部分选择开发和测试自己的驱动程序。在阅读本书之前,建议读者先购买一个基于这些微处理器之一的开发板,板上至少应有一个SPI和I2C控制器,例如Raspberry Pi3模型B板。 ---------------------------8077258 - Linux集群之美--------------------------- 全书共9章,主要是以作者的项目实践为基础,以CentOS 7.5 x86_64为主操作系统、AWS云为平台,介绍Linux传统集群技术、云原生下的负载均衡技术、MySQL的高可用方案及Python自动化运维工具的使用。 |
目录 |
[套装书具体书目] 8077258 - Linux集群之美 - 9787111669814 - 机械工业出版社 - 定价 99 8081490 - 嵌入式Linux设备驱动程序开发指南(原书第2版) - 9787111684558 - 机械工业出版社 - 定价 159 ---------------------------8081490 - 嵌入式Linux设备驱动程序开发指南(原书第2版)--------------------------- 译者序 前言 作者简介 第1章 构建系统1 1.1 引导加载程序1 1.2 Linux内核3 1.3 系统调用接口和C运行时库6 1.4 系统共享库7 1.5 根文件系统8 1.6 Linux启动过程9 1.7 构建嵌入式Linux系统10 1.8 设置以太网通信11 1.9 为NXP i.MX7D处理器构建嵌入式Linux系统11 1.9.1 简介12 1.9.2 主机软件包12 1.9.3 设置repo工具13 1.9.4 Yocto工程的安装和映像构建13 1.9.5 Yocto 之外的工作15 1.9.6 构建Linux内核18 1.9.7 安装TFTP服务器20 1.9.8 安装NFS服务器20 1.9.9 设置U-Boot环境变量21 1.10 为Microchip SAMA5D2处理器构建嵌入式Linux系统21 1.10.1 简介22 1.10.2 主机软件包22 1.10.3 Yocto工程的安装和映像构建22 1.10.4 Yocto 之外的工作25 1.10.5 构建Linux内核25 1.10.6 安装TFTP服务器27 1.10.7 安装NFS服务器27 1.10.8 设置U-Boot环境变量28 1.11 为Broadcom BCM2837处理器构建Linux嵌入式系统28 1.11.1 Raspbian28 1.11.2 构建Linux内核29 1.11.3 将文件复制到Raspberry Pi31 1.12 使用Eclipse33 1.12.1 用于内核源码的Eclipse配置33 1.12.2 用于开发Linux驱动程序的Eclipse配置38 第2章 Linux设备与驱动模型42 2.1 总线核心驱动42 2.2 总线控制器驱动45 2.3 设备驱动45 2.4 设备树简介46 第3章 最简驱动程序50 3.1 许可证51 3.2 实验3-1:“helloworld”模块51 3.3 代码清单3-1:helloworld_imx.c52 3.4 代码清单3-2:Makefile52 3.5 helloworld_imx.ko演示53 3.6 实验3-2:“带参数的helloworld”模块53 3.7 代码清单3-3:helloworld_imx_with_parameters.c54 3.8 helloworld_imx_with_parameters.ko演示54 3.9 实验3-3:“helloworld计时”模块55 3.10 代码清单3-4:helloworld_imx_with_timing.c55 3.11 helloworld_imx_with_timing.ko演示56 第4章 字符设备驱动57 4.1 实验4-1:“helloworld字符设备”模块59 4.2 代码清单4-1:helloworld_imx_char_driver.c63 4.3 代码清单4-2:Makefile65 4.4 代码清单 4-3:ioctl_test.c65 4.5 helloworld_imx_char_driver.ko演示66 4.6 将模块添加到内核构建66 4.7 使用设备文件系统创建设备文件67 4.8 实验4-2:“class字符设备”模块68 4.9 代码清单4-4:helloworld_imx_class_driver.c70 4.10 helloworld_imx_class_driver.ko演示72 4.11 杂项字符设备驱动72 4.12 实验4-3:“杂项字符设备”模块73 4.13 代码清单4-5:misc_imx_driver.c74 4.14 misc_imx_driver.ko演示75 第5章 平台设备驱动76 5.1 实验5-1:“平台设备”模块78 5.2 代码清单5-1:hellokeys_imx.c81 5.3 hellokeys_imx.ko演示82 5.4 操作硬件的文档82 5.5 硬件命名约定83 5.6 引脚控制器84 5.7 引脚控制子系统86 5.8 设备树引脚控制器绑定92 5.9 GPIO 控制器驱动96 5.10 GPIO描述符使用者接口98 5.10.1 获取和释放GPIO98 5.10.2 使用GPIO99 5.10.3 GPIO映射到中断99 5.10.4 GPIO设备树100 5.11 在内核和用户态之间交换数据100 5.12 MMIO(内存映射I/O)设备访问101 5.13 实验5-2:“RGB LED平台设备”模块103 5.13.1 i.MX7D处理器的硬件描述103 5.13.2 SAMA5D2处理器的硬件描述105 5.13.3 BCM2837处理器的硬件描述107 5.13.4 i.MX7D处理器的设备树107 5.13.5 SAMA5D2处理器的设备树111 5.13.6 BCM2837处理器的设备树114 5.13.7 “RGB LED平台设备”模块的代码描述115 5.14 代码清单5-2:ledRGB_sam_platform.c119 5.15 ledRGB_sam_platform.ko演示124 5.16 平台驱动资源124 5.17 Linux LED类126 5.18 实验5-3:“RGB LED类”模块128 5.18.1 i.MX7D、SAMA5D2和BCM2837处理器的设备树128 5.18.2 “RGB LED类”模块的代码描述130 5.19 代码清单5.3:ledRGB_sam_class_platform.c134 5.20 ledRGB_sam_class_platform.ko演示137 5.21 用户态中的平台设备驱动137 5.22 用户定义的I/O:UIO139 5.22.1 UIO如何运转140 5.22.2 内核中的UIO API141 5.23 实验5-4:“LED UIO平台”模块142 5.23.1 i.MX7D、SAMA5D2和BCM2837处理器的设备树143 5.23.2 “LED UIO平台”模块的代码描述144 5.24 代码清单5-4:led_sam_UIO_platform.c146 5.25 代码清单5-5:UIO_app.c148 5.26 led_sam_UIO_platform.ko及UIO_app演示150 第6章 I2C从端驱动151 6.1 Linux I2C 子系统152 6.2 编写I2C 从端驱动155 6.2.1 注册I2C从端驱动155 6.2.2 在设备树中声明I2C设备157 6.3 实验6-1:“I2C I/O 扩展设备”模块159 6.3.1 i.MX7D处理器的硬件描述159 6.3.2 SAMA5D2 处理器的硬件描述159 6.3.3 BCM2837处理器的硬件描述160 6.3.4 i.MX7D处理器的设备树161 6.3.5 SAMA5D2处理器的设备树162 6.3.6 BCM2837处理器的设备树163 6.3.7 “I2C I/O扩展设备”模块的代码描述164 6.4 代码清单6-1:io_imx_expander.c167 6.5 io_imx_expander.ko演示170 6.6 sysfs文件系统171 6.7 实验6-2:“I2C多显LED”模块174 6.7.1 i.MX7D处理器的硬件描述175 6.7.2 SAMA5D2处理器的硬件描述176 6.7.3 BCM2837处理器的硬件描述176 6.7.4 i.MX7D处理器的设备树177 6.7.5 SAMA5D2处理器的设备树178 6.7.6 BCM2837处理器的设备树180 6.7.7 ACPI和设备树的统一设备属性接口181 6.7.8 “I2C多显LED”模块的代码描述182 6.8 代码清单6-2:ltc3206_imx_led_class.c186 6.9 ltc3206_imx_led_class.ko演示192 第7章 处理设备驱动中的中断194 7.1 GPIO控制器在Linux内核的中断域196 7.2 设备树中断处理203 7.3 在Linux设备驱动中申请中断206 7.4 实验7-1:“按钮中断设备”模块207 7.4.1 i.MX7D处理器的硬件描述208 7.4.2 SAMA5D2处理器的硬件描述208 7.4.3 BCM2837处理器的硬件描述208 7.4.4 i.MX7D 处理器的设备树208 7.4.5 SAMA5D2 处理器的设备树209 7.4.6 BCM2837 处理器的设备树210 7.4.7 “按钮中断设备”模块的代码描述211 7.5 代码清单7-1:int_imx_key.c213 7.6 int_imx_key.ko演示215 7.7 延迟工作215 7.7.1 软中断216 7.7.2 tasklet217 7.7.3 定时器218 7.7.4 线程化的中断221 7.7.5 工作队列223 7.8 内核中的锁226 7.8.1 锁和单处理器内核227 7.8.2 在中断和进程上下文之间共享自旋锁227 7.8.3 在用户上下文使用锁227 7.9 内核中的睡眠228 7.10 实验7-2:“睡眠设备”模块229 7.10.1 i.MX7D处理器的设备树230 7.10.2 SAMA5D2处理器的设备树231 7.10.3 BCM2837处理器的设备树232 7.10.4 “睡眠设备”模块的代码描述233 7.11 代码清单7-2:int_imx_key_wait.c236 7.12 int_imx_key_wait.ko演示239 7.13 内核线程239 7.14 实验7-3:“keyled类”模块240 7.14.1 i.MX7D处理器的硬件描述240 7.14.2 SAMA5D2处理器的硬件描述241 7.14.3 BCM2837处理器的硬件描述241 7.14.4 i.MX7D 处理器的设备树242 7.14.5 SAMA5D2处理器的设备树245 7.14.6 BCM2837处理器的设备树247 7.14.7 “keyled类”模块的代码描述249 7.15 代码清单7-3:keyled_imx_class.c255 7.16 keyled_imx_class.ko演示264 第8章 在Linux驱动中分配内存266 8.1 查询ARM的MMU转换表267 8.2 Linux地址的类型271 8.3 用户进程的虚拟地址到物理地址的映射273 8.4 内核的虚拟地址到物理地址的映射273 8.5 内核内存分配器275 8.5.1 页面分配器275 8.5.2 页面分配器接口275 8.5.3 SLAB分配器276 8.5.4 SLAB分配器接口278 8.5.5 kmalloc内存分配器279 8.6 实验8-1:“链表内存分配”模块280 8.7 代码清单8-1:linkedlist_imx_platform.c283 8.8 linkedlist_imx_platform.ko演示287 第9章 在Linux设备驱动中使用DMA288 9.1 缓存一致性288 9.2 Linux DMA引擎API289 9.3 实验9-1:“流式DMA”模块295 9.4 代码清单9-1:sdma_imx_m2m.c302 9.5 sdma_imx_m2m.ko演示 306 9.6 DMA分散/聚集映射306 9.7 实验9-2:“分散/聚集DMA设备”模块 307 9.8 代码清单9-2:sdma_imx_sg_m2m.c310 9.9 sdma_imx_sg_m2m.ko演示 315 9.10 用户态DMA315 9.11 实验9-3:“用户态DMA”模块317 9.12 代码清单9-3:sdma_imx_mmap.c319 9.13 代码清单9-4:sdma.c323 9.14 sdma_imx_mmap.ko演示324 第10章 输入子系统设备驱动框架325 10.1 输入子系统驱动程序326 10.2 实验10-1:“输入子系统加速度计”模块327 10.2.1 设备树329 10.2.2 使用I2C交互的输入框架330 10.2.3 使用输入设备的输入框架331 10.3 代码清单10-1:i2c_imx_accel.c334 10.4 i2c_imx_accel.ko演示336 10.5 在Linux中使用SPI337 10.6 Linux的SPI子系统339 10.7 编写SPI从设备驱动程序 342 10.7.1 注册SPI从设备驱动程序 342 10.7.2 在设备树中声明SPI设备343 10.8 实验10-2:“SPI加速度计输入设备”模块346 10.8.1 i.MX7D 处理器的硬件描述347 10.8.2 SAMA5D2处理器的硬件描述 347 10.8.3 BCM2837处理器的硬件描述 348 10.8.4 i.MX7D处理器的设备树348 10.8.5 SAMA5D2处理器的设备树 349 10.8.6 BCM2837处理器的设备树350 10.8.7 “SPI加速度计输入设备”模块的代码描述351 10.9 代码清单10-2:adxl345_imx.c360 10.10 adxl345_imx.ko演示371 第11章 设备驱动中的工业IO 子系统373 11.1 IIO设备的sysfs接口375 11.2 IIO设备通道375 11.3 iio_info数据结构377 11.4 缓冲区378 11.4.1 IIO缓冲区的sysfs接口378 11.4.2 设置IIO缓冲区379 11.4.3 触发器380 11.4.4 触发式缓冲区380 11.5 工业I/O事件382 11.6 IIO工具386 11.7 实验11-1:“IIO子系统DAC”模块386 11.7.1 设备树387 11.7.2 用作I2C交互的工业框架389 11.7.3 用作IIO设备的工业框架389 11.8 代码清单11-1:ltc2607_imx_dual_device.c394 11.9 实验11-2:“SPIDEV双通道ADC用户”应用程序的“IIO子系统DAC”模块397 11.9.1 i.MX7D处理器的硬件描述399 11.9.2 SAMA5D2处理器的硬件描述399 11.9.3 BCM2837处理器的硬件描述399 11.9.4 i.MX7D处理器的设备树400 11.9.5 SAMA5D2处理器的设备树400 11.9.6 BCM2837处理器的设备树401 11.10 代码清单 11-2:LTC2422_spidev.c401 11.11 ltc2607_imx_dual_device.ko配合LTC2422_spidev使用演示404 11.12 实验11-3:“IIO子系统ADC”模块406 11.12.1 设备树406 11.12.2 用作SPI交互的工业框架407 11.12.3 用作IIO设备的工业框架408 11.13 代码清单11-3:ltc2422_imx_dual.c411 11.14 代码清单11-4:ltc2422_app.c413 11.15 ltc2422_imx_dual.ko配合ltc2422_app使用演示414 11.16 实验11-4:“具备硬件触发功能的IIO子系统ADC”模块415 11.16.1 i.MX7D、SAMA5D2和BCM2837处理器的设备树415 11.16.2 驱动里的睡眠和唤醒418 11.16.3 中断管理420 11.17 代码清单11-5:ltc2422_imx_trigger.c420 11.18 ltc2422_imx_trigger.ko配合LTC2422_app使用演示423 第12章 在Linux设备驱动程序中使用regmap API424 12.1 regmap的实现425 12.2 实验12-1:“SPI regmap IIO 设备”模块428 12.3 代码清单12-1:adxl345_imx_iio.c437 12.4 adxl345_imx_iio.ko演示446 第13章 Linux USB设备驱动450 13.1 USB 2.0总线拓扑450 13.2 USB总线枚举和设备布局451 13.3 USB数据传输453 13.4 USB设备类别454 13.5 USB描述符454 13.5.1 USB设备描述符455 13.5.2 USB配置描述符456 13.5.3 USB接口描述符457 13.5.4 USB端点描述符458 13.5.5 USB字符串描述符459 13.5.6 USB HID描述符459 13.6 Linux USB子系统461 13.7 编写Linux USB设备驱动程序462 13.7.1 注册USB设备驱动程序462 13.7.2 Linux主机端数据类型463 13.7.3 USB请求块465 13.8 实验13-1:USB HID设备应用程序468 13.8.1 步骤1:创建一个新工程468 13.8.2 步骤2:配置Harmony469 13.8.3 步骤3:修改生成的代码471 13.8.4 步骤4:声明USB状态机的状态471 13.8.5 步骤5:添加新成员到APP_DATA类型472 13.8.6 步骤6:声明接收缓冲区和发送缓冲区473 13.8.7 步骤7:初始化新成员473 13.8.8 步骤8:处理弹出474 13.8.9 步骤9:处理HID事件474 13.8.10 步骤10:创建USB状态机475 13.8.11 步骤11:调度新的报告接收请求477 13.8.12 步骤12:接收、准备和发送报告478 13.8.13 步骤13:烧写应用程序479 13.9 实验13-2:“USB LED”模块479 13.10 代码清单13-1:usb_led.c483 13.11 usb_led.ko演示485 13.12 实验13-3:“USB LED和开关”模块486 13.13 代码清单13-2:usb_urb_int_led.c490 13.14 usb_urb_int_led.ko演示495 13.15 实验13-4:“连接到USB多显LED的I2C”模块496 13.16 代码清单13-3:usb_ltc3206.c505 13.17 usb_ltc3206.ko演示510 附录 将内核模块移植到MicrochipSAMA5D27-SOM1上513 参考文献526 术语表528 ---------------------------8077258 - Linux集群之美--------------------------- 推荐序 前言 第1章 Linux集群基础概念 1 1.1 Linux集群涉及的核心概念及常用软件 2 1.1.1 什么是负载均衡高可用 2 1.1.2 什么是服务发现 3 1.1.3 以LVS作为负载均衡器 4 1.1.4 以Nginx作为负载均衡器 9 1.1.5 以HAProxy作为负载均衡器 10 1.1.6 高可用软件Keepalived 10 1.1.7 高可用软件Heartbeat 11 1.1.8 高可用块设备DRBD 11 1.2 负载均衡关键技术 13 1.2.1 负载均衡算法 13 1.2.2 Session共享和会话保持 17 1.3 负载均衡器的会话保持机制 19 1.3.1 负载均衡器的会话保持处理机制 19 1.3.2 LVS的持久连接机制 20 1.3.3 Nginx负载均衡器的ip_hash算法 24 1.3.4 HAProxy负载均衡器的source算法 25 1.3.5 基于cookie的会话保持处理机制 29 1.4 服务器健康检测 33 1.5 L4和L7负载均衡器对比 34 1.6 集群内(外)负载均衡 34 1.7 软件级负载均衡器的特点介绍与对比 35 1.8 小结 36 第2章 Python的基础概念及进阶知识 37 2.1 Python语言的应用领域 37 2.2 选择Python的原因 39 2.3 Python的版本说明 40 2.4 如何高效地进行Python开发工作 40 2.4.1 IPython的功能介绍 40 2.4.2 利用virtualenv隔离项目 46 2.4.3 PyCharm简介 47 2.5 Python基础知识介绍 51 2.5.1 正则表达式的应用 51 2.5.2 Python程序的构成 58 2.5.3 Python的编码问题 60 2.5.4 使用Python解析JSON 63 2.5.5 Python异常处理与程序调试异常 64 2.5.6 Python函数 67 2.5.7 Python的面向对象 79 2.5.8 Python的多进程和多线程 91 2.5.9 Python协程 105 2.6 小结 109 第3章 Python在Linux集群中的实践应用 110 3.1 Python经常用到的第三方类库 110 3.2 工作中常用的Python脚本 111 3.2.1 利用Python比较应用 111 3.2.2 利用Python获取数据库证书并替换成文件字符串 112 3.2.3 利用Python处理JSON式文件 113 3.3 利用Flask Web框架设计RESTful API 114 3.3.1 后端开发工作中为什么要使用RESTful API 114 3.3.2 项目实战 117 3.4 利用Nginx+Gunicorn+Flask部署Python项目 119 3.5 利用Flask+ Gevent搭建webssh 128 3.6 小结 137 第4章 轻量级自动化运维工具Fabric介绍 138 4.1 Vagrant简介 139 4.1.1 Vagrant的安装 139 4.1.2 使用Vagrant配置本地开发环境 141 4.1.3 使用Vagrant搭建本地开发环境 148 4.1.4 使用Vagrant搭建分布式环境 153 4.2 轻量级自动化运维工具Fabric 162 4.2.1 Paramiko版本库简介 162 4.2.2 Fabric的安装 164 4.2.3 Fabric的命令行入口fab命令详解 165 4.2.4 Fabric的环境变量设置 166 4.2.5 Fabric的核心API 167 4.2.6 Fabric的执行逻辑 171 4.3 Fabric在工作中的应用实例 173 4.3.1 开发环境中的Fabric应用实例 173 4.3.2 工作场景中常见的Fabric应用实例 174 4.4 Fabric在性能方面的不足 180 4.5 小结 180 第5章 Linux集群项目案例 181 5.1 Linux集群的项目案例详解 181 5.1.1 项目案例一:LVS在项目中的优化设计思路 181 5.1.2 项目案例二:用Nginx+Keepalived实现在线票务系统 184 5.1.3 项目案例三:企业级Web负载均衡高可用之Nginx+Keepalived 188 5.1.4 项目案例四:HAProxy双机高可用方案HAProxy+Keepalived 198 5.2 利用HAProxy代理WebSocket集群 203 5.3 巧用DNS轮询进行负载均衡 206 5.4 利用ZooKeeper集群来搭建分布式系统 211 5.5 小结 218 第6章 云原生环境下的负载均衡实现 219 6.1 私有化部署Kubernetes集群 220 6.1.1 部署Kubernetes集群环境的准备工作 220 6.1.2 Nexus3私有仓库在集群内的暴露使用 221 6.1.3 部署Kubernetes集群 222 6.1.4 Kubernetes集群数据如何持久化 228 6.2 负载均衡的具体实现 232 6.2.1 以iptables作为集群的负载均衡 232 6.2.2 以IPVS作为集群的负载均衡 241 6.2.3 服务发现 243 6.2.4 Ingress-Controller的介绍 245 6.3 小结 264 第7章 MySQL高可用集群项目案例 265 7.1 MySQL数据库的安装 265 7.2 服务器物理硬件的选择 267 7.3 MySQL数据库的优化 267 7.4 MySQL主从复制流程与原理 270 7.5 MySQL主从复制的搭建 271 7.5.1 MySQL主从复制环境介绍 271 7.5.2 影响MySQL主从复制的配置选项 272 7.5.3 MySQL主从复制的实现过程 273 7.6 MySQL MHA集群案例 274 7.6.1 MHA安装前的准备工作 275 7.6.2 源码安装MHA程序 276 7.6.3 MHA的实际安装和部署流程 277 7.6.4 MHA manager的压测 284 7.6.5 设置MHA manager为守护进程 290 7.7 MySQL DRBD高可用案例 291 7.7.1 MySQL DRBD相关组件原理介绍 292 7.7.2 MySQL DRBD的具体搭建过程 293 7.7.3 MySQL SysBench的基准测试 308 7.8 利用mysql-utilities工具自动切换主从复制 308 7.8.1 基于GTID的主从复制 308 7.8.2 mysql-utilities工具的二次开发 318 7.9 用XtraBackup工具备份和恢复数据库 319 7.9.1 XtraBackup的安装过程 319 7.9.2 XtraBackup的运行原理 319 7.9.3 XtraBackup备份及恢复过程 321 7.10 小结 322 第8章 高可用高并发系统架构设计 323 8.1 系统性能评估指标 323 8.2 网站架构设计规划预案 324 8.2.1 合理设计与规划 324 8.2.2 核心系统的开发设计 325 8.2.3 规划好网站未来的发展 325 8.2.4 合理选用开源软件方案 326 8.2.5 机房及CDN选型 326 8.2.6 CI/CD及蓝绿部署发布 327 8.2.7 系统安全问题 327 8.3 千万级PV、高性能、高并发网站的架构设计 328 8.4 亿级PV、高性能、高并发网站的架构设计 332 8.5 秒杀系统的架构设计 339 8.6 小结 343 第9章 Linux集群的总结和思考 344 9.1 集群与分布式系统的区别 344 9.2 了解微服务及其组件 346 9.3 现阶段如何保证高可用 349 9.4 小结 351 附录A Docker进阶操作总结 352 附录B 利用Nexus3配置CI/CD的私有仓库 358 附录C XtraBackup备份工具的详细测试 365 |