目录 1
第1章 引言 1
1.1 微处理器:从CISC到EPIC 1
1.1.1 微处理器分类小结 3
1.1.2 IA-64的架构和安腾 3
1.2 Linux简史 4
1.2.1 早期发展 4
1.2.2 分支发展:Linux走向多平台 6
1.2.3 IA-64 Linux 6
1.2.4 Linux发展史小结 7
1.3 Linux内核概述 7
1.3.1 主要概念 8
1.3.2 硬件模型 16
1.3.3 内核组件 17
1.3.4 内核源码 21
1.4 小结 23
第2章 IA-64架构 24
2.1 用户级指令集的架构 25
2.1.1 指令格式 25
2.1.2 指令顺序化 27
2.1.3 寄存器组 28
2.1.4 指令集概述 33
2.1.5 整型数与SIMD指令 34
2.1.6 内存/信号量指令 35
2.1.7 分支指令 37
2.1.8 与寄存器堆栈有关的指令 39
2.1.10 浮点型指令 42
2.1.11 模调度循环 42
2.1.9 控制指令 42
2.2 运行时/软件规范 45
2.2.1 数据模型 45
2.2.2 寄存器用法 46
2.2.3 过程链接 48
2.2.4 内存堆栈 49
2.2.5 寄存器堆栈 50
2.2.6 全局指针 50
2.2.7 IA-64汇编语言编程 52
2.3 系统指令集架构 55
2.3.1 系统寄存器组 55
2.3.2 特权指令 59
2.3.3 中断 60
2.4 寄存器堆栈引擎 63
2.4.1 寄存器堆栈配置寄存器 64
2.4.2 处理NaT位 65
2.4..3 RSE算术 66
2.4.4 RSE算术辅助例程 68
2.4.5 影响RSE的指令 68
2.5 小结 70
第3章 进程、任务和线程 71
3.1 Linux任务 72
3.1.1 创建任务 74
3.1.2 历史的观点 76
3.2 线程接口 77
3.2.1 pt_regs结构 78
3.2.2 switch_stack结构 79
3.2.3 线程结构 81
3.2.4 IA-64寄存器堆栈 83
3.2.5 IA-64线程状态小结 84
3.2.6 运行线程 85
3.2.7 创建线程 89
3.2.8 终止线程 94
3.2.9 跨地址空间边界移动线程 95
3.3 线程同步 97
3.3.1 并发模式 97
3.3.2 原子操作 98
3.3.3 信号量 102
3.3.4 中断屏蔽 103
3.3.5 自旋锁 104
3.4 小结 106
第4章 虚拟内存 107
4.1 虚拟内存系统简介 107
4.1.1 虚拟地址到物理地址的转换 108
4.1.2 请求页面调度 109
4.1.3 页面调度和交换 110
4.1.4 保护 111
4.2 Linux进程的地址空间 112
4.2.1 用户地址空间 113
4.2.2 页表映射的内核段 117
4.2.3 一对一映射的内核段 118
4.2.4 IA-64地址空间的结构 121
4.3 页表 124
4.3.1 折叠页表层 126
4.3.2 虚拟映射的线性页表 127
4.3.3 Linux/ia64页表的结构 129
4.3.4 页表项 131
4.3.5 页表访问 138
4.3.6 页表目录的创建 141
4.4 旁路转换缓冲区 142
4.4.1 IA-64 TLB架构 144
4.4.2 TLB一致性的维护 149
4.4.3 迟缓的TLB清除 151
4.5 页面错误处理 153
4.5.1 示例:写时复制的工作原理 154
4.5.2 Linux页面错误处理程序 156
4.5.3 IA-64实现 157
4.6 内存一致性 164
4.6.1 Linux内核中的一致性维护 165
4.6.2 IA-64实现 167
4.7 切换地址空间 168
4.7.1 地址空间切换的接口 168
4.7.2 IA-64实现 169
4.8 讨论与总结 169
第5章 内核入口与出口 171
5.1.1 内核入口路径 172
5.1 中断 172
5.1.2 内核出口路径 173
5.1.3 讨论 174
5.1.4 IA-64实现 175
5.1.5 切换IA-64寄存器堆栈 177
5.2 系统调用 184
5.2.1 错误信号 185
5.2.2 重新启动系统调用执行 186
5.2.3 从内核调用系统调用 188
5.2.4 IA-64实现 188
5.3 信号 195
5.3.1 与信号有关的系统调用 196
5.3.2 信号递交 199
5.3.3 IA-64实现 202
5.4 内核存取用户内存 205
5.4.1 示例:gettimeofday()如何返回timeval结构 208
5.4.2 禁用合法性检测 209
5.4.3 IA-64实现 210
5.5 小结 214
第6章 栈展开 215
6.1 IA-64 ELF展开段 217
6.2 内核展开接口 218
6.2.1 管理展开表 218
6.2.2 遍历调用链 219
6.2.3 访问当前帧的CPU状态 220
6.2.4 展开接口的使用 222
6.3 在汇编代码中嵌入展开信息 225
6.3.1 区间指令 227
6.3.2 序言指令 228
6.3.3 过程体指令 230
6.3.4 通用指令 230
6.3.5 实例 231
6.4 实现方面 232
6.4.1 帧信息结构 232
6.4.2 展开描述符处理 234
6.4.3 展开脚本 235
6.4.4 迟缓初始化和脚本提示 238
6.4.5 综合考虑 238
6.5 小结 239
第7章 I/O设备 240
7.1 简介 240
7.1.1 现代计算机的结构 241
7.1.2 现代计算机上的I/O软件支持 242
7.2.1 内存映射I/O 243
7.2 编程I/O 243
7.2.2 端口I/O 247
7.3 直接内存访问 250
7.3.1 PCI DMA接口 252
7.3.2 示例:发送网络数据包 256
7.3.3 IA-64实现 257
7.4 设备中断 258
7.4.1 IA-64硬件中断架构 260
7.4.2 设备中断接口 265
7.4.3 中断处理 270
7.4.4 管理IA-64中断定向逻辑 271
7.5 小结 272
第8章 对称多处理 273
8.1 Linux中的多处理 273
8.2 Linux锁定 275
8.2.1 锁定规则 276
8.2.2 大内核锁 277
8.3 多处理机支持接口 279
8.3.1 支持实用工具 279
8.3.2 IA-64实现 282
8.4 CPU相关数据 286
8.4.1 错误共享 286
8.4.2 CPU相关数据的虚拟映射 288
8.5 挂钟时间维护 289
8.5.1 多处理机中的挂钟时间维护 289
8.5.2 同步MP机器上的周期计数器 290
8.6 小结 293
第9章 系统性能 294
9.1 IA-64性能监测单元概述 296
9.1.1 PMU寄存器组 296
9.1.2 控制监测 301
9.1.3 处理计数器溢出 303
9.2 扩展安腾PMU 303
9.2.1 安腾PMU的额外功能 304
9.2.2 安腾PMU寄存器组 304
9.2.3 安腾PMU事件 305
9.2.4 事件采样的硬件支持 306
9.2.5 事件地址寄存器 308
9.2.6 分支追踪缓冲区 312
9.2.7 其他特性 315
9.3 内核性能监测支持 317
9.3.1 perfmon接口 318
9.3.2 perfmon实现 324
9.3.3 perfmon接口应用示例 329
9.4 小结 331
第10章 启动 332
10.1 IA-64固件概述 333
10.1.1 处理器抽象层 333
10.1.2 系统抽象层 338
10.1.3 高级配置和电源接口 343
10.1.4 可扩展固件接口 346
10.2 启动装载程序 354
10.2.1 装载内核映像 354
10.2.2 装载初始RAM磁盘 356
10.2.3 装载FPSWA 356
10.2.4 收集启动参数 356
10.2.5 启动内核 357
10.3 内核初始化 358
10.3.1 引导接口 359
10.3.2 IA-64实现 362
10.4 小结 365
第11章 IA-32兼容性 366
11.1 对IA-32的架构支持 367
11.1.1 IA-32用户级机器状态 367
11.1.2 IA-32用户级机器状态与IA-64寄存器之间的映射 368
11.1.3 IA-32分段与内存寻址 370
11.1.4 IA-32与IA-64之间的控制权传递 372
11.2 Linux对IA-32应用程序的支持 373
11.2.1 IA-32任务的内核表示 374
11.2.2 模拟IA-32任务的地址空间 374
11.2.3 绝对文件系统路径 378
11.2.4 启动IA-32可执行程序 379
11.2.5 系统调用模拟 382
11.2.6 信号传递 390
11.2.7 访问I/O端口空间 391
11.3 小结 392
附录A IA-64 CPU模型 393
附录B 内核寄存器用法 394
附录C IA-64指令 395
C.1 整数指令 395
C.2 内存指令 397
C.3 信号量指令 397
C.4 分支指令 397
C.5 控制指令 398
C.6 多媒体指令 399
C.7 浮点指令 399
C.8 特权指令 401
附录D 安腾PMU事件 402
附录E 词汇表 406
参考文献 410