![]()
内容推荐 "《ARM嵌入式Linux系统开发详解(第3版)》是获得大量读者好评的“Linux典藏大系”中的《ARM嵌入式Linux系统开发详解》的第3版。本书由浅入深,全面、系统地介绍基于ARM体系结构的嵌入式Linux系统开发涉及的方方面面知识,并给出53个典型实例和5个综合案例供读者实战演练。本书提供707分钟配套教学视频、程序源代码、思维导图、教学PPT、习题参考答案和软件工具等超值配套资源,帮助读者高效、直观地学习。 本书共25章,分为4篇。第1篇基础知识,包括嵌入式系统入门、嵌入式软硬件系统、ARM处理器、嵌入式Linux、软件开发环境搭建、第一个Linux应用程序;第2篇应用开发,包括Linux应用程序开发基础、多进程和多线程开发、网络通信应用、串口通信编程、嵌入式GUI程序开发、软件项目管理;第3篇系统分析,包括ARM体系结构及开发实例、深入Bootloader、解析Linux内核、嵌入式Linux的启动流程、Linux文件系统、交叉编译工具、强大的命令系统BusyBox、Linux内核移植,以及内核和应用程序调试技术;第4篇项目实战,包括Linux设备驱动开发基础知识、网络设备驱动程序开发、Flash设备驱动开发和USB驱动开发。 本书内容丰富,实用性强,适合ARM嵌入式Linux系统开发的初学者、从业者、研究者和爱好者等相关人员阅读,也适合IT培训机构和高等院校的相关专业作为教材。 " 目录 第1篇 基础知识 第1章 嵌入式系统入门\t2 1.1 什么是嵌入式系统\t2 1.2 嵌入式系统的应用领域\t2 1.2.1 家用电器和电子类产品\t2 1.2.2 交通工具\t3 1.2.3 公共电子设施\t3 1.3 嵌入式系统的发展\t4 1.3.1 嵌入式微控制器\t4 1.3.2 嵌入式微处理器\t5 1.3.3 嵌入式系统的发展方向\t5 1.4 典型嵌入式系统的组成\t6 1.5 小结\t6 1.6 习题\t7 第2章 嵌入式软硬件系统\t8 2.1 电路基础知识\t8 2.1.1 什么是模拟电路\t8 2.1.2 什么是数字电路\t8 2.1.3 数制转换\t9 2.2 计算机基础知识\t10 2.2.1 计算机体系结构的发展\t10 2.2.2 中央处理器\t10 2.2.3 存储系统\t11 2.2.4 总线系统\t11 2.2.5 输入与输出系统\t12 2.3 软件基础知识\t12 2.3.1 什么是软件\t12 2.3.2 软件的开发流程\t13 2.3.3 常见的软件开发模型\t13 2.3.4 计算机编程语言\t14 2.3.5 数据结构\t15 2.4 操作系统基础知识\t15 2.4.1 什么是操作系统\t15 2.4.2 操作系统的发展历史\t15 2.4.3 操作系统的组成\t16 2.4.4 几种操作系统的设计思路\t16 2.4.5 操作系统的分类\t17 2.5 小结\t17 2.6 习题\t17 第3章 ARM处理器\t19 3.1 微处理器和微控制器\t19 3.2 ARM处理器简介\t19 3.2.1 ARM微处理器的应用领域\t20 3.2.2 ARM处理器的优点\t20 3.3 ARM指令集\t21 3.3.1 算术运算指令\t21 3.3.2 逻辑运算指令\t22 3.3.3 分支指令\t23 3.3.4 数据传送指令\t23 3.4 ARM体系结构\t24 3.4.1 ARM体系结构的命名方法\t24 3.4.2 处理器的划分\t25 3.4.3 处理器的工作模式\t25 3.4.4 存储系统\t26 3.4.5 寻址方式\t27 3.5 ARM的功能选型\t29 3.5.1 ARM的选型原则\t29 3.5.2 几种常见的ARM核处理器选型参考\t31 3.6 小结\t32 3.7 习题\t33 第4章 嵌入式Linux\t34 4.1 常见的嵌入式操作系统\t34 4.1.1 VxWorks简介\t34 4.1.2 Windows CE简介\t35 4.1.3 PalmOS简介\t35 4.1.4 Android简介\t35 4.2 嵌入式Linux操作系统\t36 4.2.1 什么是Linux\t36 4.2.2 Linux与UNIX的不同——GPL版权协议简介\t36 4.2.3 Linux发行版\t37 4.2.4 常见的嵌入式Linux系统\t38 4.3 小结\t38 4.4 习题\t39 第5章 软件开发环境搭建\t40 5.1 安装Linux系统\t40 5.1.1 安装Ubuntu Linux\t40 5.1.2 安装和卸载软件\t43 5.1.3 配置系统服务\t43 5.1.4 安装主要的开发工具\t44 5.1.5 安装其他开发工具\t45 5.2 运行在Windows上的Linux系统\t45 5.2.1 什么是Cygwin\t45 5.2.2 安装Cygwin\t46 5.2.3 安装开发环境\t49 5.3 Linux的常用工具\t49 5.3.1 Linux Shell及其常用命令\t50 5.3.2 文本编辑工具vi\t51 5.3.3 搜索工具find和grep\t52 5.3.4 FTP工具\t56 5.3.5 串口工具minicom\t57 5.4 Windows的常用工具\t58 5.4.1 代码编辑管理工具Source Insight\t59 5.4.2 串口工具Xshell\t64 5.5 ARM的集成开发环境ADS\t66 5.5.1 ADS集成开发环境简介\t66 5.5.2 配置ADS调试环境\t67 5.5.3 建立自己的工程\t68 5.6 小结\t70 5.7 习题\t70 第6章 第一个Linux应用程序\t71 6.1 向世界问好——Hello,World! \t71 6.1.1 用vi编辑源代码文件\t71 6.1.2 用gcc命令编译程序\t72 6.1.3 执行程序\t72 6.2 程序背后做了什么\t73 6.2.1 程序执行的过程\t73 6.2.2 窥视程序执行中的秘密\t73 6.2.3 动态库的作用\t75 6.3 程序如何来的——编译的全过程\t75 6.3.1 编译源代码\t76 6.3.2 链接目标文件到指定的库\t77 6.4 更简单的办法——用Makefile管理工程\t77 6.4.1 什么是Makefile\t77 6.4.2 Makefile是如何工作的\t78 6.4.3 如何使用Makefile\t78 6.4.4 好的源代码管理习惯\t79 6.5 小结\t79 6.6 习题\t79 第2篇 应用开发 第7章 Linux应用程序开发基础\t82 7.1 内存管理和使用\t82 7.1.1 堆和栈的区别\t82 7.1.2 内存管理函数malloc()和free()\t84 7.1.3 实用的内存分配函数calloc()和realloc()\t85 7.1.4 内存管理编程实例\t86 7.2 ANSI C文件管理\t89 7.2.1 文件指针和流\t89 7.2.2 存储方式\t90 7.2.3 标准输入、标准输出和标准错误\t90 7.2.4 缓冲\t90 7.2.5 打开和关闭文件\t91 7.2.6 读写文件\t92 7.2.7 文件流定位\t94 7.2.8 ANSI C文件编程实例\t95 7.3 POSIX文件I/O编程\t96 7.3.1 底层的文件I/O操作\t96 7.3.2 文件描述符\t96 7.3.3 创建、打开和关闭文件\t97 7.3.4 读写文件内容\t100 7.3.5 文件内容定位\t101 7.3.6 修改已打开文件的属性\t102 7.3.7 POSIX文件编程实例\t102 7.4 小结\t103 7.5 习题\t104 第8章 多进程和多线程开发\t105 8.1 多进程开发\t105 8.1.1 什么是进程\t105 8.1.2 进程环境和属性\t106 8.1.3 创建进程\t107 8.1.4 等待进程结束\t109 8.1.5 退出进程\t110 8.1.6 常用进程间的通信方法\t112 8.1.7 进程编程实例\t116 8.2 多线程开发\t117 8.2.1 线程的概念\t117 8.2.2 进程和线程对比\t117 8.2.3 创建线程\t118 8.2.4 取消线程\t119 8.2.5 等待线程\t120 8.2.6 使用pthread库实现多线程操作实例\t121 8.3 小结\t122 8.4 习题\t122 第9章 网络通信应用\t124 9.1 网络通信基础\t124 9.1.1 TCP/IP簇\t124 9.1.2 IP简介\t125 9.1.3 TCP简介\t126 9.1.4 UDP简介\t127 9.1.5 网络协议分析工具Wireshark\t127 9.2 Socket通信的基本概念\t128 9.2.1 创建Socket对象\t128 9.2.2 面向连接的Socket通信\t129 9.2.3 面向连接的echo服务编程实例\t131 9.2.4 无连接的Socket通信\t135 9.2.5 无连接的时间服务编程实例\t136 9.3 Socket高级应用\t139 9.3.1 Socket超时处理\t139 9.3.2 使用Select机制处理多连接\t140 9.3.3 使用poll机制处理多连接\t141 9.3.4 多线程环境Socket编程\t143 9.4 小结\t143 9.5 习题\t144 第10章 串口通信编程\t145 10.1 串口简介\t145 10.1.1 什么是串口\t145 10.1.2 串口的工作原理\t145 10.1.3 串口的流量控制\t146 10.2 开发串口应用程序\t147 10.2.1 操作串口需要用到的头文件\t147 10.2.2 串口操作方法\t148 10.2.3 串口属性设置\t148 10.2.4 与Windows串口终端通信\t152 10.3 串口应用案例——发送手机短信\t154 10.3.1 PC与手机连接发送短信的物理结构\t154 10.3.2 AT指令简介\t155 10.3.3 GSM AT指令集\t155 10.3.4 PDU编码方式\t156 10.3.5 建立与手机的连接\t157 10.3.6 使用AT指令发送短信\t158 10.4 小结\t161 10.5 习题\t161 第11章 嵌入式GUI程序开发\t163 11.1 Linux GUI简介\t163 11.1.1 Linux GUI的发展\t163 11.1.2 常见的嵌入式GUI\t164 11.2 开发图形界面程序\t165 11.2.1 安装Qt开发环境\t165 11.2.2 建立简单的Qt程序\t167 11.2.3 Qt库编程结构\t170 11.3 深入Qt编程\t170 11.3.1 使用Widget\t170 11.3.2 对话框程序设计\t172 11.3.3 信号与槽系统\t176 11.4 将Qt移植到ARM开发板上\t177 11.4.1 tslib的移植\t177 11.4.2 Qt的移植\t178 11.4.3 安装Qt Creator编译环境\t179 11.4.4 设置Qt Creator编译环境\t184 11.4.5 配置开发板的环境变量\t187 11.5 模拟器QEMU\t188 11.5.1 使用QEMU搭建ARM嵌入式Linux开发环境\t188 11.5.2 使用Qt程序进行测试\t191 11.6 小结\t191 11.7 习题\t191 第12章 软件项目管理\t193 12.1 源代码管理\t193 12.1.1 软件的版本\t193 12.1.2 版本控制的概念\t194 12.2 版本控制系统Git\t195 12.2.1 在Linux系统中使用Git\t195 12.2.2 在Windows系统中使用Git\t198 12.3 常见的开发文档\t202 12.3.1 可行性研究报告\t202 12.3.2 项目开发计划\t202 12.3.3 软件需求说明书\t202 12.3.4 概要设计\t203 12.3.5 详细设计\t203 12.3.6 用户手册\t203 12.3.7 其他文档\t203 12.4 文档维护工具\t203 12.4.1 Sphinx工具\t203 12.4.2 GitHub工具\t206 12.5 Bug跟踪系统\t210 12.5.1 Bug管理的概念和作用\t210 12.5.2 使用Bugzilla跟踪Bug\t211 12.6 小结\t214 12.7 习题\t214 第3篇 系统分析 第13章 ARM体系结构及开发实例\t216 13.1 ARM体系结构\t216 13.1.1 ARM体系结构简介\t216 13.1.2 ARM指令集简介\t217 13.2 编程模型\t218 13.2.1 数据类型\t218 13.2.2 处理器模式\t218 13.2.3 寄存器\t219 13.2.4 通用寄存器\t219 13.2.5 程序状态寄存器\t221 13.2.6 异常处理\t221 13.2.7 内存及其I/O映射\t222 13.3 内存管理单元\t223 13.3.1 内存管理简介\t223 13.3.2 内存访问顺序\t224 13.3.3 地址翻译过程\t224 13.3.4 内存访问权限\t225 13.4 常见的接口和控制器\t225 13.4.1 GPIO简介\t225 13.4.2 中断控制器\t226 13.4.3 RTC控制器\t226 13.4.4 看门狗定时器\t227 13.4.5 使用GPIO点亮LED实例\t227 13.5 小结\t228 13.6 习题\t228 第14章 深入Bootloader\t230 14.1 初识Bootloader\t230 14.1.1 PC的Bootloader\t230 14.1.2 什么是嵌入式系统的Bootloader\t231 14.1.3 嵌入式系统常见的Bootloader\t231 14.2 U-Boot分析\t232 14.2.1 获取U-Boot\t232 14.2.2 U-Boot工程结构分析\t232 14.2.3 U-Boot的工作流程\t233 14.3 U-Boot的启动流程分析\t234 14.3.1 _start标号\t234 14.3.2 reset标号\t237 14.3.3 cpu_init_crit标号\t238 14.3.4 lowlevel_init标号\t239 14.3.5 main标号\t240 14.3.6 board_init_f()函数\t243 14.3.7 relocate_code()函数\t243 14.3.8 board_init_r()函数\t245 14.3.9 main_loop()函数\t245 14.4 U-Boot移植\t246 14.4.1 U-Boot移植的一般步骤\t246 14.4.2 将U-Boot移植到目标开发板上\t247 14.4.3 U-Boot移植的常见问题\t249 14.5 小结\t249 14.6 习题\t249 第15章 解析Linux内核\t251 15.1 基础知识\t251 15.1.1 什么是Linux内核\t251 15.1.2 Linux内核的版本\t252 15.1.3 如何获取Linux内核代码\t252 15.1.4 编译内核\t252 15.2 Linux内核的子系统\t258 15.2.1 系统调用接口\t259 15.2.2 进程管理子系统\t260 15.2.3 内存管理子系统\t261 15.2.4 虚拟文件系统\t261 15.2.5 网络堆栈\t262 15.2.6 设备驱动\t263 15.2.7 内核体系结构代码分离设计解析\t264 15.3 Linux内核代码的工程结构\t264 15.3.1 源代码目录布局\t264 15.3.2 几个重要的Linux内核文件\t266 15.4 内核编译系统\t267 15.4.1 内核编译系统的基本架构\t267 15.4.2 内核的顶层Makefile文件分析\t268 15.4.3 内核编译文件分析\t270 15.4.4 目标文件清除机制\t273 15.4.5 编译辅助程序\t273 15.4.6 Kbuild变量\t274 15.5 小结\t275 15.6 习题\t275 第16章 嵌入式Linux的启动流程\t277 16.1 Linux内核的初始化流程\t277 16.2 PC的初始化流程\t278 16.2.1 PC BIOS的功能和作用\t279 16.2.2 磁盘的数据结构\t279 16.2.3 PC的完整初始化流程\t280 16.3 嵌入式系统的初始化\t280 16.4 Linux内核的初始化\t282 16.4.1 解压缩内核映像\t282 16.4.2 进入内核代码\t284 16.5 启动init内核进程\t287 16.6 根文件系统的初始化\t288 16.6.1 根文件系统简介\t288 16.6.2 挂载虚拟文件系统\t290 16.7 内核交出权限\t295 16.8 systemd进程\t295 16.8.1 systemd的Unit\t295 16.8.2 配置文件\t295 16.8.3 常用命令\t297 16.9 初始化RAM Disk\t298 16.9.1 RAM Disk简介\t298 16.9.2 如何使用RAM Disk\t299 16.9.3 使用RAM Disk作为根文件系统实例\t299 16.10 小结\t300 16.11 习题\t301 第17章 Linux文件系统\t302 17.1 Linux文件管理\t302 17.1.1 文件和目录的概念\t302 17.1.2 文件的结构\t303 17.1.3 文件的类型\t303 17.1.4 文件系统的目录结构\t305 17.1.5 文件和目录的存取权限\t307 17.1.6 文件系统管理\t308 17.2 Linux文件系统的原理\t309 17.2.1 非日志文件系统\t309 17.2.2 日志文件系统\t310 17.3 常见的Linux文件系统\t311 17.3.1 Ext2文件系统\t311 17.3.2 Ext3文件系统\t313 17.3.3 ReiserFS文件系统\t314 17.3.4 JFFS文件系统\t315 17.3.5 CRAMFS文件系统\t317 17.4 其他文件系统\t317 17.4.1 网络文件系统\t317 17.4.2 /proc影子文件系统\t319 17.5 小结\t321 17.6 习题\t322 第18章 交叉编译工具\t323 18.1 什么是交叉编译\t323 18.2 交叉编译产生的原因\t324 18.3 安装交叉编译工具的条件\t324 18.4 如何安装交叉编译工具\t324 18.4.1 手动安装\t324 18.4.2 使用apt工具安装\t326 18.4.3 测试\t326 18.5 小结\t326 18.6 习题\t327 第19章 强大的命令系统BusyBox\t328 19.1 BusyBox简介\t328 19.1.1 简单易懂的BusyBox\t328 19.1.2 BusyBox的工作原理\t329 19.1.3 安装BusyBox\t330 19.2 交叉编译BusyBox\t333 19.3 在目标板上安装BusyBox\t335 19.4 小结\t337 19.5 习题\t337 第20章 Linux内核移植\t338 20.1 Linux内核移植的要点\t338 20.2 Linux内核的平台代码结构\t339 20.3 实现交叉编译\t340 20.3.1 加入编译菜单项\t342 20.3.2 实现编译\t343 20.4 小结\t344 20.5 习题\t344 第21章 内核和应用程序调试技术\t345 21.1 使用gdb调试应用程序\t345 21.2 基本的调试技术\t345 21.2.1 列出源代码\t348 21.2.2 断点管理\t350 21.2.3 执行程序\t352 21.2.4 显示程序变量\t352 21.2.5 信号管理\t353 21.2.6 调试实例\t354 21.3 多进程调试\t354 21.4 调试意外终止的程序\t357 21.5 内核调试方法\t359 21.5.1 printk打印调试信息\t359 21.5.2 动态输出\t360 21.5.3 BUG_ON()和WARN_ON()宏\t360 21.5.4 使用/proc虚拟文件系统\t363 21.6 小结\t364 21.7 习题\t364 第4篇 项目实战 第22章 Linux设备驱动开发基础知识\t366 22.1 设备驱动简介\t366 22.2 Linux内核模块简介\t367 22.2.1 内核模块速览\t367 22.2.2 内核模块的结构\t367 22.2.3 内核模块的加载和卸载\t368 22.2.4 编写一个基本的内核模块\t369 22.2.5 编译内核模块\t370 22.2.6 为内核模块添加参数\t371 22.3 Linux设备驱动工作方式简介\t372 22.3.1 PCI局部总线简介\t372 22.3.2 Linux设备驱动的基本概念\t373 22.3.3 字符设备\t374 22.3.4 块设备\t376 22.3.5 网络设备\t377 22.4 字符设备驱动开发案例\t377 22.4.1 开发一个基本的字符设备驱动\t377 24.4.2 测试字符设备\t380 22.5 小结\t381 22.6 习题\t381 第23章 网络设备驱动程序开发\t382 23.1 网络基础知识\t382 23.1.1 OSI网络参考模型\t382 23.1.2 Linux系统内核与TCP/IP\t383 23.2 以太网基础\t385 23.2.1 工作原理\t386 23.2.2 常见的以太网标准\t386 23.2.3 拓扑结构\t387 23.2.4 工作模式\t387 23.3 网卡的工作原理\t388 23.4 内核网络分层结构\t389 23.4.1 内核网络结构\t389 23.4.2 与网络有关的数据结构\t390 23.4.3 内核网络部分的全局变量\t391 23.5 内核网络设备驱动框架\t392 23.5.1 net_device结构\t392 23.5.2 数据包的接收流程\t394 23.5.3 数据包的发送流程\t395 23.6 DM9000网卡驱动分析案例\t396 23.6.1 DM9000芯片简介\t396 23.6.2 网卡驱动程序框架\t396 23.6.3 DM9000网卡驱动的数据结构\t397 23.6.4 加载驱动程序\t398 23.6.5 停止和启动网卡\t402 23.6.6 发送数据包\t403 23.6.7 接收数据包\t404 23.6.8 中断的处理\t405 23.7 小结\t406 23.8 习题\t406 第24章 Flash设备驱动开发\t407 24.1 Linux Flash驱动结构\t407 24.1.1 什么是MTD\t407 24.1.2 MTD系统结构\t408 24.2 Flash设备基础\t409 24.2.1 存储原理\t409 24.2.2 性能比较\t410 24.3 内核MTD层\t411 24.3.1 mtd_info结构\t411 24.3.2 mtd_part结构\t415 24.3.3 mtd_partition结构\t415 24.3.4 map_info结构\t416 24.3.5 nand_chip结构\t418 24.4 Flash设备框架\t419 24.4.1 NOR Flash设备驱动框架\t419 24.4.2 NAND Flash设备驱动框架\t420 24.5 NAND Flash设备驱动分析案例\t421 24.5.1 S3C2440 NAND控制器简介\t421 24.5.2 数据结构\t423 24.5.3 注册驱动\t424 24.5.4 驱动卸载\t427 24.5.5 初始化NAND控制器\t427 24.5.6 设置芯片操作\t429 24.5.7 电源管理\t431 24.6 小结\t432 24.7 习题\t432 第25章 USB驱动开发\t433 25.1 USB体系概述\t433 25.1.1 USB的设计目标\t433 25.1.2 USB体系简介\t434 25.1.3 USB体系的工作流程\t435 25.2 USB驱动程序框架\t435 25.2.1 Linux内核USB驱动框架简介\t435 25.2.2 主机驱动结构\t438 25.2.3 设备驱动结构\t442 25.2.4 USB驱动程序框架\t445 25.3 USB驱动案例剖析\t447 25.3.1 USB串口驱动\t447 25.3.2 USB键盘驱动\t449 25.4 小结\t452 25.5 习题\t452 |