批量上传,套装书可能不全,下单前咨询在线客服!有特殊要求,下单前请咨询客服!
¥ 40.88 4.6折 ¥ 89 全新
库存15件
作者朱文伟 李建英
出版社清华大学出版社
ISBN9787302649243
出版时间2024-01
装帧平装
开本16开
定价89元
货号29667619
上书时间2024-11-04
前
随着超大规模集成电路的发展,计算机处理器技术不断提高,计算机芯片的处理能力越来越强,体积越来越小,计算机技术广泛应用到生活的方方面面。与人们日常生活打交道最多的就是嵌入式系统,从目前广泛使用的手机、MP3播放器、家用电器到无人机、自动驾驶汽车、机器人,嵌入式系统的应用无处不在。嵌入式系统的开发占整个计算机系统开发的比重也越来越大。
嵌入式系统开发与传统的计算机程序开发不同。嵌入式系统开发涉及软件和硬件的开发,是一个协同工作的统一体。目前,已经有许多的嵌入式系统硬件和操作系统软件,其中应用最广泛的是ARM/AArch64嵌入式处理器和Linux系统。
写作思路
嵌入式开发的涉及面很广,要在一本书中讲述所有内容是不可能的。可以这么说,如果谁看到某本书囊括很多内容,但篇幅又不大,那基本上是蜻蜓点水,毫无深度。嵌入式开发必须集中某个知识点学透相关知识,才能从事这方面的基本开发,然后在工作中不断提高。那应该如何进行学习呢?笔者的经验是分两大块来学,分别是主机端的驱动和设备端系统的构建。
通常嵌入式产品都会有一个主机端运行的用户程序(或称客户端),它通过主机端的驱动和设备端应用程序通信,指示设备端完成某个功能;而设备端也是一个Linux系统,它除运行设备端应用程序外,还要运行设备端驱动程序,以此让设备端应用程序和设备端的某个硬件设备通信。但初学者(比如,学生朋友)不可能购买所有的设备端硬件(费用太高)来学习设备端驱动,因此我们可以把学习驱动的过程放在主机端来,也就是在主机端的Linux虚拟机中学习驱动开发,一旦学会,以后转到设备端开发驱动程序大同小异,甚至只是换个编译器而已。
另外,笔者为了让初学者节省学习成本,把主机端的驱动开发也尽量做成虚拟驱动开发,也就是说没有硬件,不需要购买昂贵的开发板,也可以学习驱动开发。区别就是看不到实际硬件的工作结果,但我们可以用数据来表示,比如驱动模块收到上层发来的数据1,就表示灯亮了。在实际工作中,我们只需要替换调用一下厂家提供的硬件操作API函数即可,这些函数我们可以现学现用,没必要在初学阶段去掌握。
除驱动开发外,设备端的系统构建也是一个难点,幸运的是,我们依然可以使用QEMU这个软件来模拟一个开发板,并在QEMU上编译一个内核并启动这个内核,再加上文件系统,等等。这些步骤与实际在开发板上的操作区别不大。开发板最多就是多了一个Uboot(类似于计算机的BIOS)开机引导程序,而这个开机引导程序开发板厂家也是会提供的。
基于这两点(驱动和基于内核的系统构建),我们以此为重点贯穿本书,并给出较多的实例和详细的说明,相信读者能够快速进入嵌入式开发的大门。
源码资源下载
本书配套示例源码需要用微信扫描下面的二维码获取,也可按扫描出来的页面提示输入你的电子邮箱,把下载链接发送到邮箱中再下载。
如果在学习和下载资源的过程中遇到问题,可以发送邮件至booksaga@163.com,邮件主题写“嵌入式Linux驱动开发实践”。
作者答疑服务
如果在学习过程中遇到问题,也可以向作者写信或加作者QQ,作者联系方式参见下载资源中的相关文件。
作 者
2023年12月
人们日常生活中打交道最多的就是嵌入式系统,目前广泛使用的手机、MP3播放器、智能家用电器、无人机、自动驾驶汽车、机器人等都用到了嵌入式系统,嵌入式系统的开发占整个计算机系统开发的比重也越来越大。本书详细讲解嵌入式Linux驱动开发和设备端系统构建,并配套全书实例源代码和作者QQ答疑服务。 《嵌入式Linux驱动开发实践》共分12章,内容包括嵌入式系统概述、搭建Linux安全开发环境、必会的嵌入式开发应用层技术、内核模块开发、字符设备驱动、驱动模块的并发控制、块设备驱动、Linux平台驱动、基于AArch64的内核和文件系统、设备树、I2C驱动实战、SPI驱动实战。 《嵌入式Linux驱动开发实践》适合作为嵌入式Linux驱动开发初学者的入门书,以及嵌入式Linux开发人员的参考书,也适合作为高等院校电子、通信、自动化、计算机等专业“嵌入式操作系统”课程的教材和教学参考书。
朱文伟,名校计算机专业统招硕士,20多年C\C 、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 &n
— 没有更多了 —
以下为对购买帮助不大的评价