目录 1
第一章 引论 1
1·1 引言 1
1·1·1 本指南的目的 1
1·1·2 本指南的内容 1
1·1·3 如何使用本指南 2
1·2 符号约定 2
1·2·1 有关的文档 3
2·2 软件包的内容 5
2·1 软件打包概述 5
第二章 应用软件打包 5
2·3 软件包的结构生命周期 6
2·4 打包工具 6
2·4·1 pkgmk命令 6
2·4·2 pkgtrans命令 7
2·4·3 pkgproto命令 7
2·4·4 prototype文件 7
2·4·4·1 描述行 8
图和表 9
图2-1 #1prototype文件样本 9
2·4·4·2 命令行 9
2·6 软件包信息文件 10
图2-2 #1prototype文件样本 10
2·5 安装工具 10
图2-3 pkginfo文件样本 11
2·6·1 pkginfo文件 11
2·6·2 pkgmap文件 11
图2-4 compver文件样本 12
2·6·4 depend文件 12
2·6·3 compver文件 12
图2-5 depend文件样本 13
2·6·5 space文件 13
图2-7 copyright文件样本 14
图2-6 space文件样本 14
2·7 安装脚本 14
2·6·7 request文件 14
2·6·6 copyright文件 14
2·7·1 脚本处理 15
2·7·3 为脚本获取软件包信息 16
2·7·2 安装参数 16
图2-8 将参数置入安装环境 17
2·7·5·1 请求脚本的命名约定 17
2·7·5 请求脚本 17
2·7·4 脚本的出口码 17
2·7·6 分类动作脚本 18
2·7·6·2 分类动作脚本的使用规则 18
2·7·6·1 分类动作脚本的命名约定 18
2·7·5·2 请求脚本的使用规则 18
2·7·6·3 类的安装 19
2·7·7·1 sed类脚本 20
2·7·7 特别系统类 20
2·7·6·4 类的删除 20
图2-9 sed脚本格式 21
2·7·7·2 awk类脚本 21
图2-10 awk脚本格式 22
2·7·7·3 build类脚本 22
2·7·8 过程脚本 22
2·7·8·1 过程脚本的命名约定 22
2·7·8·2 过程脚本的使用规则 23
2·8 打包的基本步骤 23
2·8·1 第一步 指定软件包的简称 24
2·8·2 第二步 定义一个软件包实例 24
2·8·2·1 标识软件包实例 24
2·8·2·2 在脚本中引用实例标识符 25
2·8·3 第三步 将对象分类 25
2·8·4·1 定义群体可重定位对象 26
2·8·4·2 定义个体可重定位对象 26
2·8·4 第四步 使软件包对象可重定位 26
2·8·5 第五步 书写安装脚本 27
2·8·6 第六步 定义软件包的相关性 27
2·8·9·1 手工创建prototype文件 28
2·8·7 第七步 书写版权消息 28
2·8·9 第九步 创建prototype文件 28
2·8·8 第八步 创建pkginfo文件 28
2·8·9·2 用pkgproto创建prototype文件 30
2·8·11 第十一步 用pkgmk创建一个软件包 32
2·8·10 第十步 将软件包分布在多个卷上 32
2·8·11·2 帮助pkgmk确定软件包内容的位置 33
2·8·11·1 pkgmk创建一个软件包实例 33
2·8·12 第十二步 用pkgtrans创建一个软件包 33
2·8·12·2 转换一个软件包实例 34
2·8·12·1 创建一个数据流软件包 34
3·1·1 什么是UNIX的设备驱动程序 35
第三章 设备驱动程序 35
3·1 设备驱动程序 35
3·2·0·1 系统缓冲区 36
3·2 驱动程序的任务及责任 36
3·1·2 一般的UNIX驱动程序 36
3·2·0·3 进程的睡眠和唤醒 37
3·2·0·2 系统与用户空间之间的数据传输 37
3·2·0·4 核心计时器 38
3·2·0·5 驱动程序的同步段和中断段 38
3·2·0·7 驱动程序的临界区 39
3·2·0·6 中断处理 39
3·2·0·8 如何在核心和设备之间移动数据 40
3·3·0·1 设备的类型 42
3.3 UNIX系统的驱动程序特点 42
3·2·0·9 DMA分配例程 42
3·3·0·2 特别文件 42
3·3·0·4 /dev目录 43
3·3·0·3 主设备号和次设备号 43
3·3·1 设备驱动程序源文件的结构 44
3·3·1·1 包含文件 44
3·3·0·5 主文件和系统文件 44
3·3·1·2 通用系统数据结构 45
3·3·1·3 驱动程序专用的数据结构 46
3·3·1·4 设备标志devflag 46
3·4 函数说明(驱动程序入口点) 47
3·4·0·1 Poll 47
3·4·0·2 Kenter 47
3·4·0·3 Kexit 48
3·4·0·4 中断处理程序 48
3·5·0·1 睡眠与唤醒 49
3·4·0·5 共享中断与DMA通道 49
3·4·0·6 函数命名约定 49
3·5 系统实用函数 49
3·5·0·2 延迟函数 50
3·5·0·3 块驱动程序的biowait/biodone事件的同步 51
3·5·0·4 设置处理器优先级 51
3·5·0·5 中断优先级 53
3·5·0·6 睡眠优先级 53
3·5·0·7 Timeout 55
3·5·1 出错报告 56
3·5·2 分配缓冲区空间 56
3·5·2·1 核心内存分配 56
3·5·2·2 缓冲区池 57
3·5·4 ID概要 58
3·5·3 可安装驱动程序的实现 58
3·6 控制器接口基础 58
3·6·0·1 中断 59
3·6·0·2 I/O地址和控制器存储地址 60
3·6·0·3 DMA控制器操作 60
3·6·1 用户接口 61
3·6·1·1 用户特权 61
3·6·1·2 与SVR4.0/386中的其它进程间的相互影响 61
3·6·2 可安装的驱动程序个数 61
3·7 对ID的修改 62
3·7·0·4 ID目录结构 62
3·7·0·1 主文件 62
3·7·0·2 系统文件 62
3·7·0·3 space·c 62
3·7·0·5 由配置进程生成的设备#define 64
3·8·0·3 Idbuild 65
3·8·0·2 Idinstall 65
3·8 安装驱动程序并重构UNIX操作系统核心的命令 65
3·8·0·1 Idcheck 65
3·9 驱动程序软件包 66
3·9·0·3 System(必需的) 67
3·9·0·2 Master(必需的) 67
3·9·0·1 Driver·o(必需的) 67
3·9·0·6 Init(任选的) 68
3·9·0·5 Node(任选的) 68
3·9·0·4 Space·c(任选的) 68
3·9·0·9 Postinstall(必需的) 69
3·9·0·8 Shutdown(任选的) 69
3·9·0·7 Rc(任选的) 69
3·9·0·10 Preremove(必需的) 70
3·9·0·11 模块小结 71
表3-1 驱动程序软件包的组成模块 71
3·9·1 基本系统驱动程序 72
3·9·2 更新驱动程序软件包 73
3·9·3 安装/删除小结 73
3·9·4 可调的系统参数 74
3·9·5 修改一个现有的核心参数 74
3·9·7 重新配置核心以启用新参数 75
3·9·6 定义一个新的核心参数 75
3·9·8 设备驱动程序开发方法 75
3·9·9 驱动程序开发过程 75
3·9·9·1 紧急状态下的恢复(新的核心无法引导) 77
3·10 驱动程序的调试 78
3·10·0·1 核心打印语句 78
3·10·0·2 跟踪驱动程序 79
3·10·0·3 系统的致命错误 79
3·10·0·4 将系统卸出 79
3·10·0·5 postinstall脚本 81
3·10·0·6 preremove脚本 81
3·10·0·7 如何为驱动程序的安装编制文档 81
3·10·1 将XENIX系统V/386设备驱动程序转换为SVR 4.0/386的设备驱动程序 82
4·2·1 打包中的变化 85
4·2 UNIX Release 3.0、3.1和3.2 85
4·1 引言 85
第四章 兼容性方面的考虑 85
4·2·2·1 文件系统类型 86
4·2·2 文件系统 86
4·2·2·3 目录的布局 89
4·2·2·2 /proc文件系统类型 89
4·2·2·4 符号连结 90
4·2·3 STREAMS驱动程序 93
4·2·4 网络服务 94
4·2·5 国际化 95
4·2·6·2 增强的加锁功能 99
4·2·6·1 核心存储分配程序 99
4·2·6 存储分配 99
4·2·7·2 浮点变化 100
4·2·7·1 编译程序的变化 100
4·2·7 标准C开发环境(SCDE) 100
4·2·7·4 可扩展的连结格式(ELF) 101
4·2·7·3 排错变化 101
4·2·7·5 动态共享库 102
4·2·8 可调参数:动态及静态 103
4·2·9·1 基本的EFT数据类型 104
4·2·9 扩展的基本类型:EFT 104
表4-1 基本EFT数据类型 105
4·2·9·2 EFT兼容性问题 105
4·2·10 其它 107
5·1 引言 109
第五章 视象接口 109
5·2·4 正文方式和图形方式 110
5·2·3 寄存器 110
5·2·2 存储区 110
5·2·1 视象适配器板 110
5·2 视象显示程序设计的概念性概述 110
5·2·5 程序设计的步骤 111
5·2·4·2 图形方式 111
5·2·4·1 正文方式 111
5·2·5·1 开始之前 111
5·2·5·2 正文方式 112
5·2·5·3 图形方式 112
5·3·1·1 确定适配器类型 113
5·3·1 视象适配器板 113
5·3 视象显示程序设计的技术性概述 113
5·3·1·2 方式的获取与设置 115
5·4·2 字符集 117
5·4·1 正文是如何存放的 117
5·4 正文方式下的程序设计 117
5·4·4 转义序列 118
5·4·3 选择正文方式 118
5·4·5 正文方式程序设计的例子 119
5·4·6 正文程序设计存储管理 121
5·4·6·1 存储布局 121
5·5 存取视象存储区的程序设计 124
5·5·0·1 取得物理地址 125
5·5·0·2 映射视象存储区 125
5·5·0·3 映射举例 126
5·6·1 存取图形方式的视象存储区 126
5·6 图形方式 126
5·5·0·4 与MAPCONS的关系 126
5·6·1·1 在EGA图形方式下对视象存储区寻址 131
5·7 存取视象控制器寄存器 133
5·6·1·3 方式切换 133
5·6·1·2 VGA独有的寻址方式 133
5·7·0·1 利用寄存器提高效率 135
5·7·0·2 寄存器编程举例 135
5·8·1 引言 138
5·8 使用虚拟终端 138
5·8·2 终端用户使用虚拟终端 139
5·8·3 程序设计的特点 140
5·8·3·1 VT操作方式 140
5·8·4·1 性能良好的图形应用程序举例 141
5·8·4 书写性能良好的程序 141
5·8·5 编写虚拟终端使用管理程序 147
5·8·6 虚拟终端的创建和应用 150
5·8·7 确定VT状态 153
5·8·8 虚拟终端控制 155
5·9·4 字体操作 161
5·9·3 声音效果 161
5·9·2 键盘操作 161
5·9·1 设置边界 161
5·9 其它功能 161
5·9·4·2 替换字库中的个别字符 162
5·9·5 对鼠标器编程 162
5·9·4·1 替换整个字库 162
附录A liber,一个图书馆系统 169
附录B 软件包安装实例分析 181
B·1 引言 181
B·2 实例#1 181
B·2·1 技术 181
B·2·2 方法 181
图B-1 实例#1pkginfo文件 182
B·2·3 样本文件 182
图B-2 实例#1prototype文件 183
图B-3 实例分析#1请求脚本 184
B·3 实例#2 185
B·3·1 技术 185
B·3·2 方法 185
B·3·3 样本文件 186
图B-4 实例#2prototype文件 186
图B-5 实例#2pkginfo文件 187
图B-6 实例#2请求脚本 187
图B-7 实例#2postinstall脚本 188
B·4·2 方法 189
B·4·1 技术 189
B·4 实例#3 189
图B-8 实例#3pkginfo文件 190
图B-9 实例#3prototype文件 190
B·4·3 样本文件 190
图B-11 实例#3安装类动作脚本(i·admin) 191
图B-10 实例#3space文件 191
B·5 实例#4 192
图B-12 实例#3删除类动作脚本(r·cfgdata) 192
B·5·1 技术 192
B·5·2 方法 192
B·5·3 样本文件 193
图B-13 实例#5pkginfo文件 193
图B-14 实例#4copyright文件 193
图B-16 实例#4depend文件 194
B·6·1 技术 194
B·6 实例#5a 194
图B-15 实例#4compver文件 194
B·6·3 样本文件 195
B·6·2 方法 195
图B-17 实例#5a pkginfo文件 196
图B-18 实例#5a prototype文件 196
图B-19 实例#5a sed脚本(/sbin/inittab) 196
图B-20 实例#5a postinstall脚本 197
B·7·2 方法 197
B·7·1 技术 197
B·7 实例#5b 197
图B-21 实例#5b pkginfo文件 198
图B-22 实例#5b prototype文件 198
B·7·3 样本文件 198
图B-24 实例#5b删除类动作脚本(r·inittab) 199
图B-23 实例#5b安装类动作脚本(i·inittab) 199
B·8·2 方法 200
B·8·1 技术 200
B·8 实例#5c 200
图B-25 实例#5b inittab文件 200
B·8·3 样本文件 201
图B-27 实例#5c prototype文件 201
图B-26 实例#5c pkginfo文件 201
B·9 实例#6 202
B·9·1 技术 202
图B-28 实例#5c build脚本(/sbin/inittab) 202
B·9·2 方法 202
图B-29 实例#6pkginfo文件 203
B·9·3 样本文件 203
图B-30 实例#6protoype文件 204
图B-31 实例#6安装类别动作脚本(i·cron) 204
图B-34 实例#6sys crontab文件(与软件包一起传送) 205
图B-32 实例#6删除类动作脚本(r·eron) 205
图B-33 实例#6根crontab文件(与软件包一起传送) 205
附录C 跟踪驱动程序 207
附录D 一个软盘驱动程序原型 219
附录E 一个驱动程序软件包样本 241
附录F 综合视象程序设计举例 249
附录G 图形方式小结 265
G·1 SW_BG320 265
G·2 SW_CG320 265
G·3 SW_BG640 266
G·4 SW_GG320_D 266
G·5 SW_CG640_W 267
G·6 SW_CG640×350 267
G·7 SW_ENH_CG640 268
G·8 SW_VGA640×480C 268
G·9 SW_VGA640×480E 268
G·10 SW_VGA320×200 269
G·11 SW_ATT640 269
G·12 SW_VDC800×600E 269
G·13 SW_VDC640×400V 270
附录H 正文和图形方式IOCTLs 271
H·1 正文方式选择IOCTLs 271
H·2 图形方式选择IOCTLs 271
H·3 display(7)loctl小结 272
附录I UNIX兼容性表 275
I·1 引言 275
I·1·1 参考表格的用法 275
I·2 参考表 277
附录J 地区和时区环境变量 303
J·2 LANG环境变量 303
J·1 引言 303
J·3 TZ环境变量 304