Linux嵌入式设计
分類: 图书,计算机/网络,操作系统/系统开发,LINUX ,
作者: (美)史密斯 等著,周伟民 译
出 版 社: 人民邮电出版社
出版时间: 2008-12-1字数: 442000版次: 1页数: 312印刷时间: 2008/12/01开本: 16开印次: 1纸张: 胶版纸I S B N : 9787115187475包装: 平装编辑推荐
现代嵌入式产品是包括处理器、操作系统和应用软件的复杂设备。有些书讲述如何在嵌入式硬件上运行Linux,还有一些书讲述如何创建Linux应用程序.而本书是第一本描述如何结合两者开发Linux嵌入式产品的图书。您将亲身体会到为何Linux够成为低成本和快速开发的最佳选择。
本书介绍了如何开发良好的嵌入式产品——具有更多类型的界面和更多动态界面更好的已调试界面。您将学会如何创建后端程序、如何处理异步事件,以及如何将各种用户界面(包括网络、帧缓存、红外控制、SNMP和前端面板)连接到这些进程,从而实现远程配置和操作。书中同时也介绍了运行时访问库(Run—time Access library),该库为用户界面提供了一种与守护进程通信的统一机制。
从本书能够学到:
将用户界面从守护进程中分离出来;
让用户界面在运行时可以访问配置、状态和统计数据;
为应用程序添加网络管理功能;
使用SNMP和创建MIB:
创建基于网络的产品界面;
创建命令行界面;
创建以红外控制为输入的帧缓存界面;
命令行界面(CLI);
管理产品中的日志和警报信息。
内容简介
本书介绍如何开发一个Linux产品,将产品分成守护进程和用户界面两个部分,介绍如何创建和管理守护进程,同时还介绍5种不同类型的用户界面。
本书主要内容有:产品架构;如何与正在运行的守护进程对话;如何创建和保护守护进程;范例产品Laddie;日志和事件处理;基于Web的用户界面;命令行界面(CLI);前端面板界面;帧缓存界面,包括红外遥控;SNMP界面,包括工具、MIB和代理。
本书适用于Linux产品的开发人员,有兴趣的读者可以以本书中所包含的原型产品为基础设计自己的Linux产品。对于那些打算尽快将守护进程的用户界面移植到不同的操作系统或不同的编程语言上的读者,本书也有一定参考价值。
目录
第1章 产品体系结构
1.1 用户界面和守护进程
1.1.1 守护进程
1.1.2 用户界面
1.1.3 进程间通信
1.2 Laddie产品的体系结构
小结
第2章 管理守护进程
2.1 管理守护进程的通用方法
2.1.1 基于文件的管理
2.1.2 基于守护进程的Web界面
2.1.3 全能方法
2.2 控制和状态协议
2.2.1 控制和状态协议的要求
2.2.2 通用控制和状态协议
小结
第3章 使用实时访问
3.1 RTA产品体系结构
3.2 RTA守护进程体系结构
3.3 将列和表告知RTA
3.3.1 列
3.3.2 表
3.4 创建第一个RTA程序
3.4.1 问题描述
3.4.2 回顾代码
3.4.3 安装RTA
3.4.4 编译和连接
3.4.5 测试
3.5 一些SQL命令
3.5.1 SELECT
3.5.2 UPDATE
3.5.3 WHERE
3.5.4 LIMIT
3.6 RTA内置表介绍
3.6.1 rta_dbg
3.6.2 rta_stat
3.6.3 rta_tables
3.6.4 rta_columns
3.7 RTA表编辑器
小结
第4章 创建守护进程和保证守护进程安全
4.1 如何创建守护进程
4.1.1 加载守护进程配置数据
4.1.2 进入后台
4.1.3 成为进程和会话头(session leader)
4.1.4 设置工作目录
4.1.5 重定向stdin、stdout和stderr
4.1.6 创建日志
4.1.7 设置组ID和用户ID
4.1.8 检查pidfile
4.1.9 设置umask
4.1.10 创建信号处理器
4.2 如何保证守护进程安全
4.2.1 设计安全的守护进程
4.2.2 编写安全的守护进程
4.2.3 降低攻击的破坏程度
4.3 原型守护进程
小结
更多参考书目
第5章 范例产品:LADDIE报警系统
5.1 报警系统简介传感器
5.2 Laddie功能特征
5.2.1 ladd的配置和状态
5.2.2 ladd的警报处理
5.3 Laddie硬件设计
5.4 Laddie软件设计
5.4.1 appInit()回调子程序
5.4.2 poll_timeout()回调子程序
5.4.3 user_update()回调子程序
5.5 创建和测试ladd
小结
第6章 日志
6.1 是否需要日志
6.2 日志系统的体系结构
6.2.1 信息源
6.2.2 信息路由
6.2.3 信息目的地
6.3 syslog
6.3.1 syslog体系结构
6.3.2 使用syslog
6.3.3 syslog协议
6.3.4 使用syslogd守护进程
6.3.5 局限、优点和syslogd的替代程序
6.4 按需定制的日志
小结
第7章 Laddie事件处理
7.1 新事件处理系统的基本原理
7.2 logmuxd的特性和功能
7.3 配置logmuxd
7.3.1 logmuxd源
7.3.2 logmuxd过滤器和重写
7.3.3 logmuxd目的地
7.4 使用logmuxd的范例
7.4.1 范例1:logmuxd示范
7.4.2 范例2:logmuxd和已接受TCP连接
7.4.3 范例3:logmuxd和SNMP陷阱
小结
第8章 设计Web界面
8.1 Web基础知识
8.1.1 DNS和TCP
8.1.2 webserver
8.1.3 CGI
8.1.4 JavaScript
8.1.5 发展中的技术
8.2 确定产品Web界面的需求
8.3 选择webserver
8.3.1 选择
8.3.2 使用PHP
8.3.3 个案研究:Linksys WRT54G无线路由器
8.3.4 个案研究:TUX webserver
8.3.5 webserver比较
8.4 UI设计
8.4.1 菜单系统
8.4.2 对话框
8.4.3 错误信息
8.4.4 使用Ajax提高响应速度
8.5 实现
8.5.1 与守护进程交互
8.5.2 报警状态网页
8.5.3 报警设置网页
8.5.4 网页版面设计和菜单系统
8.5.5 webserver无关性
8.5.6 使用Ajax进行异步更新
8.6 改进我们的设计
8.7 资源
小结
第9章 设计命令行界面
9.1 为什么需要CLI
9.1.1 安全性
9.1.2 实用性
9.1.3 带宽
9.1.4 脚本化能力
9.1.5 配置备份和恢复
9.2 CLI的类型
9.2.1 句子
9.2.2 向导
9.2.3 菜单
9.2.4 有状态的
9.2.5 字符界面与线界面的比较
9.3 让用户可以访问CLI
9.4 Laddie CLI
9.4.1 Laddie命令汇总
9.4.2 set logs on
9.4.3 dump
9.4.4 help
9.5 测试命令的代码研究
9.5.1 CLI词汇表:token.l
9.5.2 CLI语法:syntax.y
9.5.3 C代码
9.5.4 代码研究注解
小结
第10章 创建前端面板界面
10.1 按钮、LED和LCD
10.1.1 按钮
10.1.2 LED
10.1.3 LCD
10.2 设计前端面板UI
10.2.1 简单化
10.2.2 尝试、失败、再次尝试
10.2.3 使用LCD菜单和模式
10.2.4 快速响应
10.3 Laddie前端面板
10.3.1 Laddie的LCD菜单系统
10.3.2 Laddie前端面板硬件
10.3.3 Laddie前端面板UI
10.4 改进我们的设计
小结
第11章 设计帧缓存界面
11.1 视频内存的工作原理
11.1.1 视频内存中的字节是如何被解释的
11.1.2 视频内存是如何被映射到显示屏上的
11.2 Linux帧缓存设备驱动程序
11.2.1 使用open、read、write和close操作帧缓存
11.2.2 使用ioctl命令配置帧缓存
11.2.3 一个简单帧缓存图形程序
11.3 图形库
11.4 使用SDL创建“Hello, world!”范例
11.4.1 初始化库
11.4.2 初始化帧缓存
11.4.3 创建一个surface
11.4.4 显示surface
11.4.5 处理事件
11.5 图形UI工具包
11.5.1 使用STBmenu创建简单UI
11.5.2 使用STBmenu创建“Hello,world!”范例
11.6 Laddie帧缓存UI
小结
第12章 红外遥控器
12.1 使用红外线进行通信
12.1.1 编码遥控命令的协议
12.1.2 通过调制减少对红外线信号的干扰
12.1.3 使用红外线控制产品
12.2 遥控接收器的硬件
12.2.1 探测和解调红外线信号
12.2.2 解码遥控波形
12.2.3 Laddie产品的红外线遥控硬件
12.3 为Laddie产品安装和配置LIRC
12.3.1 安装LIRC软件
12.3.2 配置lirc_serial内核设备驱动程序
12.3.3 测试lirc_serial驱动程序
12.3.4 配置lircd守护进程
12.3.5 测试lircd守护进程
12.3.6 配置应用程序的LIRC工具
12.3.7 控制Laddie产品
小结
第13章 SNMP实践概述
13.1 快速浏览术语
13.2 软件
13.3 安装SNMP
13.3.1 下载和安装
13.3.2 检查安装
13.3.3 配置代理
13.3.4 启动代理
13.4 探索SNMP
13.4.1 可读性强的MIB文件名
13.4.2 联网打印机
13.4.3 snmptable命令
13.4.4 MIB-2:TCP连接表
13.4.5 MIB-2:UDP表
13.4.6 MIB-2内容
13.5 使用SNMP写入值
13.5.1 设置sysContact
13.5.2 设置sysName
13.6 SNMP陷阱
13.6.1 使用snmptrapd接收陷阱
13.6.2 携带数据的陷阱:linkUp和linkDown
小结
第14章 设计SNMP MIB
14.1 我们的目标
14.2 企业编号
14.3 MIB文件
14.4 LADDIE-GROUP-SMI
14.5 创建LAD-MIB
14.5.1 模块定义
14.5.2 版本号和防区数
14.5.3 警报表
14.5.4 陷阱
14.6 验证MIB
小结
第15章 实现你的SNMP MIB
15.1 Net-SNMP代理
15.2 MIB框架——mib2c
15.3 头文件——ladProject.h
15.4 代码文件——ladProject.c
15.4.1 包含
15.4.2 基准OID
15.4.3 MIB对象定义
15.4.4 RTA访问函数
15.4.5 初始化函数
15.4.6 标量
15.4.7 读警报表
15.4.8 写警报表
15.5 重访Makefile
15.6 调试
15.7 陷阱
小结
附录A RTA参考资料
A.1 RTA概述
A.2 RTA常量
A.3 数据结构
A.4 API子程序
A.4.1 dbcommand()子程序
A.4.2 rta_add_table()子程序
A.4.3 SQL_string()子程序
A.4.4 rta_config_dir()子程序
A.4.5 rta_save()子程序
A.4.6 rta_load()子程序
A.5 SELECT和UPDATE语法
A.5.1 SELECT命令
A.5.2 UPDATE命令
A.6 内部RTA表
A.6.1 rta_tables表
A.6.2 rta_columns表
A.7 调试配置
A.8 错误信息
A.8.1 SQL请求信息
A.8.2 内部调试信息
A.9 回调函数
A.9.1 读回调函数
A.9.2 写回调函数
附录B SNMP综述
B.1 为什么使用SNMP
B.2 代理和管理器
B.3 名字空间、语法和协议
B.4 MIB
B.5 OID
B.6 MIB-2
B.7 SMI
B.8 SNMP协议
B.8.1 基本命令:GET、SET和GETNEXT
B.8.2 使用GETNEXT遍历MIB
B.8.3 陷阱和通告
B.8.4 命令行工具:范例
B.9 SNMPv1、SNMPv2和SNMPv3
B.10 SNMP数据类型
B.11 SNMP表
B.12 定义新类型
B.13 MIB文件的结构
小结
附录C 安装帧缓存设备驱动程序
C.1 为你的视频卡寻找帧缓存设备驱动程序
C.1.1 vesafb驱动程序
C.1.2 硬件相关驱动程序
C.1.3 没有包含在Laddie光盘中的驱动程序
C.2 配置帧缓存设备驱动程序
C.2.1 vesafb驱动程序
C.2.2 硬件相关驱动程序
附录D DB-To-File工具
D.1 概述
D.2 表定义
D.2.1 tbl2file表
D.2.2 tbl2field表
D.3 tbl2filed范例
D.4 安全注意事项
附录E Laddie产品可启动光盘
E.1 运行Laddie产品
E.1.1 启动光盘
E.1.2 操作帧缓存用户界面
E.1.3 访问Web界面
E.1.4 体验Linux shell和其他用户界面
E.1.5 关闭Laddie产品
E.2 了解光盘内容
E.2.1 Laddie产品源代码
E.2.2 Laddie产品库
E.2.3 启动脚本
E.2.4 Linux From-Scratch发行版及附加软件包
E.3 重新编译Laddie产品
书摘插图
第2章 管理守护进程
2.2 控制和状态协议
2.2.1 控制和状态协议的要求
在设计自己的控制和状态协议时,必须基于以下标准调整你的设计:客户端和守护进程的数据模型、现有协议和软件的重新利用、客户端和守护进程的约束以及发现其系统的便利性。
1.数据模型
控制和状态协议应该允许客户端和守护进程具有相同的数据模型。也就是说,如果守护进程使用变量、结构、列表和数组,那么控制和状态协议另一端的客户端也应该支持变量、结构、列表和数组。协议两端使用同样的数据模型将更加便于重新利用代码,而且可以帮助程序员在解决问题时保持一致的意见。
2.利用现有的标准和代码
控制和状态协议应该尽可能地利用现有的软件和标准。你或许可以找到那些对现有协议和软件非常熟悉的开发者,而且这些协议和软件很可能为那些需要了解它们的开发者提供了很好的文档。因为新代码越少,意味着出现的错误越少,所以使用现有的代码总是一个好办法。
3.对守护进程和客户端的少量约束
在理想状态下,协议对守护进程设计的约束比较少,且不会增加守护进程的大小。你可以通过对main源文件进行少量修改,从而把控制和状态协议添加程序当中。在使用控制和状态协议改进老程序时,你可以把大量的新代码分散到不同的源文件中,而不是把所有的改变都混杂在main代码文件中。对协议进行客户端联编(binding),对于所有的主流编程语言来说应该都是可行的,至少对于使用Java和PHP创建的Web界面和使用C和C++作为编译代码来说是可行的。
4.发现机制
我们希望不依赖文档获得产品所包含的信息,如通过ls命令可以找到Unix文件系统中的匹配文件;通过get-next操作符可以获取SNMP MIB所包含的内容;数据库中的系统表则描述数据库本身。同样,我们想要的是这么一种机制,用户通过它能够发现产品中可配置的内容和产品中所包含的信息。
……