第1章 嵌入式Linux基础 1<br> 1.1 什么是嵌入式Linux 1<br> 1.2 嵌入式Linux的特点 2<br> 1.3 嵌入式Linux的应用范围 2<br> 1.4 嵌入式Linux的开发模式 3<br> 1.5 嵌入式Linux发展面临的挑战 4<br> 1.6 嵌入式Linux的发展前景 5<br> 1.7 嵌入式Linux应用程序开发必备技能 6<br>第2章 搭建Linux开发服务器 8<br> 2.1 Fedora概述 8<br> 2.2 VMware workstation概述 9<br> 2.3 Fedora5的安装 10<br> 2.4 配置linux服务器 31<br> 2.4.1 怎样开通常用网络服务 31<br> 2.4.2 ping不通Linux主机怎么办 31<br> 2.4.3 由telnet连不上Linux主机怎么办 32<br> 2.4.4 怎样让root用户telnet到主机 32<br> 2.4.5 怎样配置Samba服务器——创建登录用户 32<br> 2.4.6 怎样配置Samba服务器 33<br> 2.4.7 登录主机提示找不到网络路径怎么办 33<br> 2.4.8 登录主机提示指定的网络名不再可用怎么办 33<br> 2.4.9 tftp下载主机文件超时怎么办 33<br> 2.4.10 NFS配置——开启服务并添加共享文件夹 34<br> 2.4.11 NFS配置——共享目录不能被挂载怎么办 34<br> 2.4.12 怎样修改File Browser风格——显示地址栏 34<br> 2.4.13 怎样修改Linux主机的屏幕分辨率 34<br> 2.4.14 怎样修改Linux主机的网络接入方式 34<br> 2.4.15 Fedora 5安装完毕以后不能添加/删除软件怎么办 35<br> 2.4.16 Fedora 5不能在SCSI虚拟硬盘上安装怎么办 36<br>第3章 常用Linux命令介绍 37<br> 3.1 常用命令介绍 37<br> 3.1.1 文件管理命令 37<br> 3.1.2 备份压缩 39<br> 3.1.3 磁盘管理和维护 39<br> 3.1.4 系统管理和维护 41<br> 3.1.5 文档搜索和查找 44<br> 3.1.6 网络相关 44<br> 3.2 常见问题探讨 45<br> 3.2.1 cp和scp拷贝丢失符号链接怎么办 45<br> 3.2.2 fgrep搜索时感觉很慢怎么办 46<br> 3.2.3 烧写NAND Flash后文件系统校验出错怎么办 46<br> 3.2.4 怎样在开发板上查看内核版本和硬件平台 46<br> 3.2.5 怎样查看/设置/删除默认网关 46<br> 3.2.6 设置默认网关显示网络不可达怎么办 46<br> 3.2.7 怎样通过命令设置DNS地址 46<br> 3.2.8 busybox命令date设置时间出错怎么办 47<br> 3.2.9 busybox命令udhcpc不能设置IP地址怎么办 47<br> 3.2.10 busybox命令telnetd让其他主机连接失败怎么办 47<br> 3.2.11 怎样在开发板上格式化U盘并创建文件系统 47<br> 3.2.12 怎样在开发板上挂载U盘 48<br>第4章 搭建嵌入式Linux开发环境 49<br> 4.1 搭建嵌入式开发环境 49<br> 4.1.1 搭建交叉编译环境 49<br> 4.1.2 编译内核 53<br> 4.1.3 编译标准函数库 53<br> 4.1.4 编译bootloader 53<br> 4.1.5 开发编译应用程序 53<br> 4.1.6 在Linux上开启tftp、nfs、ssh、telnet等服务 54<br> 4.1.7 使用超级终端远程登录 54<br> 4.1.8 构建嵌入式Linux根文件系统 54<br> 4.1.9 制作根文件系统镜像 55<br> 4.2 常见问题探讨 55<br> 4.2.1 了解Windows编程 55<br> 4.2.2 不会写驱动和u-boot怎么办 56<br> 4.2.3 不会写makefile怎么办 56<br> 4.2.4 SecureCRT特别配置 57<br> 4.2.5 Linux内核配置时M不能修改怎么办 57<br> 4.2.6 开发板上/proc中没有scsi文件夹怎么办 58<br> 4.2.7 开发板上/proc/bus/usb中没有设备信息怎么办 58<br> 4.2.8 开发板上/sys为空怎么办 59<br> 4.2.9 开发板启动时找不到init进程的原因 59<br> 4.2.10 怎样进行只读文件系统调试 59<br> 4.2.11 采用NFS调试时出现RPC错误的原因 60<br> 4.2.12 烧写jffs2镜像之后重启很慢的原因 60<br> 4.2.13 无法找到"libstdc++.so.6"怎么办 60<br> 4.2.14 不能执行二进制文件怎么办 60<br> 4.2.15 errno是否线程安全 61<br> 4.2.16 注意bootloader传给内核的启动参数 61<br> 4.2.17 怎样在内核drivers目录下添加模块 61<br> 4.2.18 怎样实时监测USB等hotplug设备 63<br>第5章 如何移植开源代码 68<br> 5.1 交叉编译开源代码 69<br> 5.1.1 下载开源代码 69<br> 5.1.2 在host上运行程序 69<br> 5.1.3 交叉编译 70<br> 5.2 在开发板上运行 72<br> 5.3 开源代码向工程中移植 74<br> 5.4 常见问题探讨 77<br> 5.4.1 版本的选择 77<br> 5.4.2 执行configure脚本失败时怎么办 77<br> 5.4.3 链接以两个下划线开头的函数显示未定义怎么办 77<br> 5.4.4 某些源文件不能编译时的解决办法 77<br> 5.4.5 交叉编译的文件在开发板上的放置位置 77<br> 5.4.6 在程序中调用交叉编译的程序 78<br> 5.4.7 移植的程序运行时写文件失败的原因 78<br> 5.4.8 源码移植时的注意事项 78<br>第6章 简单shell编程 79<br> 6.1 什么是shell 79<br> 6.2 &命令 79<br> 6.3 shell输入与输出——echo和管道(|) 80<br> 6.3.1 echo 80<br> 6.3.2 管道(|) 80<br> 6.4 正则表达式 80<br> 6.5 shell变量——本地变量、环境变量、位置变量参数 81<br> 6.5.1 本地变量 81<br> 6.5.2 环境变量 84<br> 6.5.3 位置变量参数 85<br> 6.6 引号的使用——双引号、单引号、 反引号、反斜线 86<br> 6.6.1 双引号 86<br> 6.6.2 单引号 87<br> 6.6.3 反引号 87<br> 6.6.4 反斜线 87<br> 6.7 条件测试 88<br> 6.7.1 文件状态测试 88<br> 6.7.2 逻辑操作符 88<br> 6.7.3 字符串测试 89<br> 6.7.4 数值测试 89<br> 6.8 shell的流控制结构——流控制和循环 90<br> 6.8.1 流控制 90<br> 6.8.2 循环 92<br> 6.9 使用shell函数 95<br> 6.10 shell编程实践 96<br> 6.11 常见问题 96<br>第7章 socket编程 98<br> 7.1 常用函数介绍 98<br> 7.2 编程实例 103<br> 7.2.1 使用select实现超时连接 103<br> 7.2.2 非阻塞数据收发操作 106<br> 7.2.3 简单服务器 108<br> 7.2.4 加入组播 110<br> 7.2.5 组播服务器 112<br> 7.3 常见问题探讨 114<br> 7.3.1 怎样实现内核级PPP拨号程序 114<br> 7.3.2 PPPOE拨号一直不成功怎么办 115<br> 7.3.3 PPPOE拨号成功获取IP地址但不能上网怎么办 115<br> 7.3.4 给ppp0设置了默认网关仍不能上网怎么办 115<br> 7.3.5 通过system函数启动PPPOE拨号死机怎么办 116<br> 7.3.6 非法关机导致pppoe下次连接失败怎么办 116<br> 7.3.7 PPPOE拨号上网是否要加包过滤 116<br> 7.3.8 IP地址设置成功后仍ping不通同网段内其他主机怎么办 116<br> 7.3.9 错误SIOCADDRT: Network is unreachable的原因分析 117<br> 7.3.10 修改socket接收缓冲区大小的方法 117<br> 7.3.11 修改内核中IGMP支持版本的方法 118<br> 7.3.12 错误Too many open files in system的原因分析 118<br> 7.3.13 接收HTTP或RTSP应答数据时的注意事项 118<br> 7.3.14 注意select设置超时的方式 120<br> 7.3.15 域名解析花费时间长的解决办法 121<br> 7.3.16 非阻塞socket无限等待的解决办法 123<br> 7.3.17 用setsockopt+SO_SNDTIMEO实现连接超时 123<br> 7.3.18 调用setsockopt时出现错误No such device的解决办法124<br> 7.3.19 断电重启以后连接服务器失败的解决办法 124<br>第8章 多线程编程 125<br> 8.1 线程管理函数 125<br> 8.2 线程属性操作函数 127<br> 8.3 实例讲解 130<br> 8.3.1 创建线程并查看其属性 130<br> 8.3.2 pthread_exit的错误用法 134<br> 8.3.3 自封装函数create_thread 136<br> 8.4 多线程同步 142<br> 8.4.1 互斥锁(mutex)常用函数介绍 142<br> 8.4.2互斥锁的两种初始化方式及应用 144<br> 8.4.3 信号量(semaphore)常用函数介绍 148<br> 8.4.4 二值信号量应用——互斥锁 149<br> 8.4.5 多值信号量应用——停车场问题 152<br> 8.5 多线程通信 155<br> 8.5.1 通过全局变量通信 155<br> 8.5.2 系统V消息队列 155<br> 8.5.3 POSIX消息队列 163<br> 8.5.4 自封装消息队列 170<br> 8.6 常见问题探讨 173<br> 8.6.1 使用多线程的好处 173<br> 8.6.2 程序运行到pthread相关函数时阻塞怎么办 174<br> 8.6.3 线程被取消后用ps还能看到其PID怎么办 174<br> 8.6.4 在嵌入式Linux上是否使用实时优先级 175<br> 8.6.5 嵌入式Linux线程分离属性的设置 175<br> 8.6.6 用kill系统调用终止线程的隐患 175<br> 8.6.7 用pthread_kill终止线程 175<br>第9章 常见死机问题探讨 179<br> 9.1 常见死机及原因分析 179<br> 9.1.1 打印函数输出格式或者参数顺序不对 179<br> 9.1.2 除数为0 181<br> 9.1.3 应用程序链接不匹配的库文件或驱动 181<br> 9.1.4 操作未初始化的指针 182<br> 9.1.5 操作空指针 183<br> 9.1.6 系统内存耗尽 187<br> 9.1.7 重复释放同一块内存 188<br> 9.1.8 free释放栈内存 190<br> 9.1.9 malloc/new返回的地址被修改 193<br> 9.1.10 内存越界 196<br> 9.1.11 分配过大的栈内存 197<br> 9.1.12 分配过大的静态内存 198<br> 9.1.13 递归调用导致栈内存不够 199<br> 9.1.14 操作“野指针” 200<br> 9.1.15 未调用模块的初始化函数 204<br> 9.1.16 混用名称和功能相近的函数 204<br> 9.1.17 平台问题 205<br> 9.1.18 平台编译规则引起的死机 205<br> 9.1.19 程序编译不完全 207<br> 9.2 死机调试 207<br> 9.2.1 gdb远程调试 208<br> 9.2.2 抓取死机core文件 208<br> 9.3 死循环 209<br> 9.3.1 无符号数和0比较作为循环条件 209<br> 9.3.2 循环退出条件不当 209<br> 9.3.3 链表操作不当 211<br> 9.4 关键任务死锁或阻塞 212<br> 9.4.1 关键任务调用阻塞函数 212<br> 9.4.2 嵌套调用mutex或semaphore 213<br> 9.4.3 操作消息队列时无限等待 215<br>附录 218<br>后记 241
展开