书籍详情

嵌入式Linux驱动开发实践

嵌入式Linux驱动开发实践

作者:朱文伟 李建英

出版社:清华大学出版社

出版时间:2024-01-01

ISBN:9787302649243

定价:¥89.00

购买这本书可以去
内容简介
  人们日常生活中打交道最多的就是嵌入式系统,目前广泛使用的手机、MP3播放器、智能家用电器、无人机、自动驾驶汽车、机器人等都用到了嵌入式系统,嵌入式系统的开发占整个计算机系统开发的比重也越来越大。本书详细讲解嵌入式Linux驱动开发和设备端系统构建,并配套全书实例源代码和作者QQ答疑服务。 《嵌入式Linux驱动开发实践》共分12章,内容包括嵌入式系统概述、搭建Linux安全开发环境、必会的嵌入式开发应用层技术、内核模块开发、字符设备驱动、驱动模块的并发控制、块设备驱动、Linux平台驱动、基于AArch64的内核和文件系统、设备树、I2C驱动实战、SPI驱动实战。 《嵌入式Linux驱动开发实践》适合作为嵌入式Linux驱动开发初学者的入门书,以及嵌入式Linux开发人员的参考书,也适合作为高等院校电子、通信、自动化、计算机等专业“嵌入式操作系统”课程的教材和教学参考书。
作者简介
  朱文伟,名校计算机专业统招硕士,20多年CC 、Java开发经验。主导开发过密码、图形、人工智能等产品。精通Linux、Windows系统开发及数据库开发技术。著有图书:《高性能Linux网络编程核心技术揭秘》《Linux C/C 服务器开发实践》《Qt 6.x从入门到精通》《PyQt 5从入门到精通》《Linux C与C 一线开发实践》《Visual C 2017从入门到精通》《Windows C/C 加密解密实战》《密码学原理与Java实现》《OpenCV 4.5计算机视觉开发实战(基于VC )》《OpenCV 4.5计算机视觉开发实战:基于Python》。
目录

第 1 章  嵌入式系统概述 1
1.1  嵌入式系统 1
1.2  Linux操作系统 2
1.3  Linux作为嵌入式操作系统的优势 2
1.4  嵌入式系统的开发流程 4
1.5  嵌入式Linux系统的体系结构 5
1.5.1  嵌入式处理器 5
1.5.2  嵌入式外围硬件设备 5
1.5.3  嵌入式操作系统 6
1.5.4  设备驱动 6
1.5.5  嵌入式应用软件 6
1.6  嵌入式Linux系统的设计与实现 6
1.7  Linux操作系统内核 7
1.7.1  Linux内核的组成 7
1.7.2  Linux内核各部分的工作机制 8
1.8  Linux设备驱动程序 12
1.8.1  Linux设备驱动概述 12
1.8.2  设备驱动的功能 13
1.8.3  设备的分类 13
1.8.4  驱动的分类 14
1.8.5  设备驱动与内核的关系 16
1.8.6  设备驱动的结构 17
1.8.7  设备驱动的设计和实现步骤 19
第 2 章  搭建Linux驱动开发环境 22
2.1  准备虚拟机环境 22
2.1.1  在VMware下安装Linux 22
2.1.2  开启登录时的root账号 25
2.1.3  关闭内核自动更新 27
2.1.4  解决Ubuntu上的vi方向键问题 27
2.1.5  关闭防火墙 27
2.1.6  配置安装源 28
2.1.7  安装网络工具包 28
2.1.8  安装基本开发工具 29
2.1.9  启用SSH 29
2.1.10  做个快照 30
2.1.11  连接虚拟机Linux 31
2.1.12  和虚拟机互传文件 42
2.2  安装编译工具 42
2.3  使用VS Code开发内核驱动程序 43
2.4  使用Visual C 2017开发应用程序 48
第 3 章  嵌入式开发必会应用层技术 51
3.1  Linux启动过程 51
3.2  图形模式与命令模式的切换方式 53
3.3  在文件中搜索 53
3.4  Linux关机和重启 54
3.5  开机自启动 55
3.6  查看Ubuntu的内核版本 56
3.7  查看Ubuntu操作系统的版本 57
3.8  配置文件的区别 57
3.9  让/etc/profile文件修改后立即生效 58
3.10  测试Web服务器的性能 59
3.10.1  架设Web服务器Apache 59
3.10.2  在Windows下测试Web服务器的性能 60
3.10.3  在Linux下测试Web服务器的性能 61
3.11  Linux中的文件权限 66
3.12  环境变量的获取和设置 66
3.13  解析命令行参数函数 69
第 4 章  内核模块开发 70
4.1  Linux内核概述 70
4.2  内核模块简介 71
4.2.1  何为内核模块 71
4.2.2  增加内核功能的两种方法 72
4.2.3  使用模块的优缺点 72
4.2.4  常用的模块操作命令 72
4.2.5  Linux内核程序结构 73
第 5 章  字符设备驱动 76
5.1  Linux设备框架 76
5.2  字符设备的概念 77
5.3  字符设备驱动 80
5.3.1  file_operations结构体 80
5.3.2  字符设备驱动开发步骤 82
5.3.3  设备号的分配 85
5.4  驱动开发的常用函数 86
5.4.1  copy_from_user函数 86
5.4.2  copy_to_user函数 87
5.4.3  printk函数 88
5.4.4  register_chrdev函数 89
5.4.5  register_chrdev_region函数 91
5.4.6  alloc_chrdev_region函数 91
5.4.7  cdev_init函数 91
5.4.8  cdev_alloc函数 92
5.4.9  cdev_add函数 93
5.4.10  cdev_del函数 95
5.4.11  宏class_create 95
5.4.12  device_create函数 96
5.4.13  device_del函数 96
5.4.14  unregister_chrdev函数 97
5.4.15  实战字符设备驱动 97
5.5  字符设备的ioctl接口 106
5.5.1  什么是ioctl接口 106
5.5.2  为什么要引入ioctl接口 106
5.5.3  ioctl如何使用 106
5.5.4  定义命令 107
5.5.5  ioctl的基本应用 109
5.5.6  ioctl处理结构体 112
5.6  Linux虚拟驱动框架设计 114
5.7  虚拟LED驱动的实现 116
第 6 章  驱动模块的并发控制 122
6.1  嵌入式Linux系统的空间组成 122
6.1.1  操作系统内核 122
6.1.2  操作系统的空间组成及模式 123
6.1.3  用户空间访问内核空间及模式切换 123
6.2  进程的基本概念 124
6.2.1  进程和线程的定义 124
6.2.2  进程的类型 125
6.2.3  进程的内存结构 125
6.2.4  多任务机制 126
6.2.5  进程与程序 126
6.2.6  进程标识符 127
6.2.7  线程标识符 129
6.2.8  线程组及其标识符TGID 129
6.2.9  进程描述符 131
6.2.10  会话、进程组以及控制终端 138
6.3  PID的管理 139
6.3.1  PID散列表 140
6.3.2  PID命名空间 140
6.3.3  局部ID和全局ID 142
6.3.4  进程PID结构 143
6.3.5  pid_link哈希表存储 143
6.4  进程切换分析 145
6.4.1  进程的模式和分类 145
6.4.2  进程的5种基本状态 146
6.4.3  进程的切换过程分析 147
6.5  内核进程和线程管理编程 148
6.5.1  获得进程PID结构体 148
6.5.2  从命名空间下的PID找到对应的PID结构体 149
6.5.3  获取进程的进程号 150
6.5.4  改变PID结构体的count字段 151
6.5.5  获取进程描述符信息 152
6.5.6  释放进程所占用的Cache空间 153
6.5.7  唤醒进程 154
6.5.8  创建一个新的内核线程 156
6.5.9  终止指定进程 158
6.5.10  结束当前正在执行的进程 159
6.6  并发控制的基本概念 160
6.6.1  什么是并发 160
6.6.2  临界资源与临界区 160
6.6.3  原子操作 160
6.6.4  并发控制的内容 161
6.6.5  为何要并发控制 161
6.7  设备驱动的并发控制机制 162
6.7.1  并发控制的基础操作 162
6.7.2  自旋锁 164
6.7.3  信号量 165
6.7.4  其他的并发控制机制 166
6.7.5  驱动并发控制的设计方法 167
6.8  内核同步编程 170
6.8.1  设置原子类型的变量并读取 170
6.8.2  递增递减原子变量值 171
6.8.3  初始化信号量 172
6.8.4  获取信号量并减1(不可中断) 173
6.8.5  获取信号量并减1(可中断) 174
6.8.6  在指定的时间内获取信号量 175
6.8.7  释放信号量 176
第 7 章  块设备驱动 178
7.1  块设备的概念 178
7.1.1  什么是块设备 178
7.1.2  常用的块设备 178
7.1.3  块设备和字符设备的区别 179
7.1.4  块设备相关的几个单位 180
7.1.5  块设备的访问 181
7.2  块设备驱动程序的概念 182
7.2.1  什么是块设备驱动程序 182
7.2.2  为什么需要了解块设备驱动 182
7.2.3  块设备驱动的组成部分 183
7.2.4  块设备驱动框架 184
7.3  块设备驱动的关键数据结构 187
7.3.1  通用硬盘结构gendisk 187
7.3.2  块设备对象结构block_device 188
7.3.3  bio结构 189
7.3.4  请求队列request_queue结构 189
7.3.5  请求结构request 190
7.3.6  磁盘操作结构block_device_operations 191
7.4  块设备驱动中的I/O请求处理函数 192
7.4.1  使用请求队列处理I/O请求 192
7.4.2  不使用请求队列处理I/O请求 192
7.5  块设备驱动编写的步骤 193
7.6  重要函数 193
7.6.1  注册 193
7.6.2  块设备操作 194
7.7  实战案例:用RAM模拟一个块设备 195
第 8 章  Linux平台驱动 203
8.1  平台设备驱动模型 203
8.1.1  驱动的分隔与分离 203
8.1.2  驱动的分层 205
8.1.3  基本概念 205
8.1.4  什么是platform总线 206
8.2  platform驱动 209
8.2.1  platform_driver结构体 209
8.2.2  platform主要函数 211
8.2.3  platform驱动框架 212
8.2.4  platform_device的注册过程 214
8.3  platform设备 215
8.4  实现platform驱动 218
第 9 章  基于AArch64的内核和文件系统 229
9.1  认识QEMU 230
9.1.1  QEMU是什么 230
9.1.2  QEMU的两种执行模式 231
9.1.3  QEMU的用途 231
9.1.4  使用QEMU虚拟机的几种选择 231
9.2  不编译运行AArch64程序 232
9.2.1  准备一个现成的AArch64程序 233
9.2.2  安装Linux版的QEMU 233
9.2.3  下载交叉编译器 238
9.2.4  让AArch64程序运行起来 238
9.3  编译运行AArch64程序 240
9.4  制作简易文件系统 244
9.4.1  BusyBox简介 245
9.4.2  编译/安装BusyBox 246
9.4.3  制作根文件系统的映像文件 249
9.5  非嵌入式方式启动内核 250
9.5.1  BusyBox启动过程简要分析 254
9.5.2  在新内核系统中运行C程序 256
9.6  基本功能的完善 257
9.6.1  挂载proc支持ifconfig 257
9.6.2  挂载sysfs支持lspci 259
9.6.3  实现文件系统可写 264
9.7  QEMU用户网络模式 265
9.7.1  不使用-net选项 265
9.7.2  使用-net选项 269
9.8  QEMU桥接网络模式 270
9.8.1  网桥的概念 270
9.8.2  TUN/TAP的工作原理 270
9.8.3  带TAP的QEMU系统架构 272
9.8.4  brctl的简单用法 273
9.8.5  三个网络配置选项 275
9.8.6  实战桥接模式网络 277
9.8.7  手工命令创建TAP网卡 282
9.8.8  使用qemu-ifup 284
9.9  QEMU运行国产操作系统 285
9.9.1  安装Windows版的QEMU 286
9.9.2  UEFI固件下载 286
9.9.3  安装麒麟操作系统 287
9.9.4  运行麒麟系统 289
第 10 章  设备树 291
10.1  设备树的概念 291
10.1.1  什么是设备树 291
10.1.2  设备树的起源 292
10.1.3  Linux内核对硬件的描述方式 294
10.1.4  设备树和内核的关系 295
10.2  DTS文件和DTSI文件 295
10.3  DTB文件和DTC文件 296
10.4  设备树框架 297
10.4.1  布局与节点 298
10.4.2  节点名 299
10.4.3  引用 300
10.4.4  cpus节点 301
10.5  属性 302
10.5.1  兼容性属性 303
10.5.2  model属性 305
10.5.3  status属性 305
10.5.4  #address-cells和#size-cells 305
10.5.5  reg属性 306
10.5.6  ranges属性 307
10.5.7  name属性 308
10.5.8  device_type属性 308
10.5.9  address属性 308
10.5.10  interrupts属性 309
10.6  设备树操作常用API 311
10.6.1  device_node 311
10.6.2  查找节点API 312
10.6.3  提取通用属性API 312
10.6.4  提取addr属性API 313
10.6.5  提取resource属性API 314
10.6.6  提取GPIO属性API 315
10.6.7  提取irq属性API 315
10.6.8  从设备树中提取MAC地址 315
10.7  编写设备树并编译 315
第 11 章  I2C驱动实战 317
11.1  I2C的基本概念 317
11.1.1  总线的定义 317
11.1.2  什么是I2C 318
11.1.3  I2C总线 318
11.1.4  I2C总线规范 318
11.1.5  I2C总线的特点 319
11.2  I2C驱动实战 320
第 12 章  SPI驱动实战 334
12.1  SPI概述 334
12.1.1  什么是SPI 334
12.1.2  SPI工作模式 337
12.1.3  SPI传输机制 338
12.1.4  I2C和SPI的对比 340
12.2  SPI驱动软件架构 340
12.2.1  SPI通用设备驱动程序 341
12.2.2  SPI控制器驱动程序 342
12.2.3  SPI协议驱动程序 342
12.2.4  队列化 343
12.3  SPI虚拟驱动实战 343
 
猜您喜欢

读书导航