图书介绍
软件调试 卷1 硬件基础 第2版PDF|Epub|txt|kindle电子书版本网盘下载
![软件调试 卷1 硬件基础 第2版](https://www.shukui.net/cover/17/31312826.jpg)
- 张银奎著 著
- 出版社: 北京:人民邮电出版社
- ISBN:9787115492500
- 出版时间:2018
- 标注页数:485页
- 文件大小:87MB
- 文件页数:514页
- 主题词:调试软件
PDF下载
下载说明
软件调试 卷1 硬件基础 第2版PDF格式电子书版下载
下载的文件为RAR压缩包。需要使用解压软件进行解压得到PDF格式图书。建议使用BT下载工具Free Download Manager进行下载,简称FDM(免费,没有广告,支持多平台)。本站资源全部打包为BT种子。所以需要使用专业的BT下载软件进行下载。如BitComet qBittorrent uTorrent等BT下载工具。迅雷目前由于本站不是热门资源。不推荐使用!后期资源热门了。安装了迅雷也可以迅雷进行下载!
(文件页数 要大于 标注页数,上中下等多册电子书除外)
注意:本站所有压缩包均有解压码: 点击下载压缩包解压工具
图书目录
第一篇 绪论3
第1章 软件调试基础3
1.1 简介3
1.1.1 定义3
1.1.2 基本过程5
1.2 基本特征5
1.2.1 难度大6
1.2.2 难以估计完成时间7
1.2.3 广泛的关联性7
1.3 简要历史8
1.3.1 单步执行8
1.3.2 断点指令10
1.3.3 分支监视11
1.4 分类12
1.4.1 按调试目标的系统环境分类12
1.4.2 按目标代码的执行方式分类12
1.4.3 按目标代码的执行模式分类13
1.4.4 按软件所处的阶段分类13
1.4.5 按调试器与调试目标的相对位置分类14
1.4.6 按调试目标的活动性分类14
1.4.7 按调试工具分类15
1.5 调试技术概览15
1.5.1 断点15
1.5.2 单步执行16
1.5.3 输出调试信息17
1.5.4 日志17
1.5.5 事件追踪17
1.5.6 转储文件18
1.5.7 栈回溯18
1.5.8 反汇编18
1.5.9 观察和修改内存数据19
1.5.10 控制被调试进程和线程19
1.6 错误与缺欠19
1.6.1 内因与表象19
1.6.2 谁的bug20
1.6.3 bug的生命周期21
1.6.4 软件错误的开支曲线21
1.7 重要性23
1.7.1 调试与编码的关系23
1.7.2 调试与测试的关系24
1.7.3 调试与逆向工程的关系24
1.7.4 学习调试技术的意义25
1.7.5 调试技术尚未得到应有的重视25
1.8 本章小结26
参考资料26
第二篇 CPU及其调试设施29
第2章 CPU基础29
2.1 指令和指令集29
2.1.1 基本特征30
2.1.2 寻址方式31
2.1.3 指令的执行过程32
2.2 英特尔架构处理器33
2.2.1 80386处理器34
2.2.2 80486处理器34
2.2.3 奔腾处理器35
2.2.4 P6系列处理器36
2.2.5 奔腾4处理器38
2.2.6 Core 2系列处理器38
2.2.7 Nehalem微架构39
2.2.8 Sandy Bridge微架构39
2.2.9 Ivy Bridge微架构40
2.2.10 Haswell微架构40
2.2.11 Broadwell微架构41
2.2.12 Skylake微架构41
2.2.13 Kaby Lake微架构41
2.3 CPU的操作模式42
2.4 寄存器44
2.4.1 通用数据寄存器44
2.4.2 标志寄存器45
2.4.3 MSR寄存器46
2.4.4 控制寄存器46
2.4.5 其他寄存器48
2.4.6 64位模式时的寄存器49
2.5 理解保护模式50
2.5.1 任务间的保护机制50
2.5.2 任务内的保护51
2.5.3 特权级52
2.5.4 特权指令53
2.6 段机制54
2.6.1 段描述符54
2.6.2 描述符表56
2.6.3 段选择子56
2.6.4 观察段寄存器57
2.7 分页机制59
2.7.1 32位经典分页60
2.7.2 PAE分页66
2.7.3 IA-32e分页68
2.7.4 大内存页71
2.7.5 WinDBG的有关命令72
2.8 PC系统概貌73
2.9 ARM架构基础75
2.9.1 ARM的多重含义75
2.9.2 主要版本76
2.9.3 操作模式和状态78
2.9.4 32位架构核心寄存器80
2.9.5 协处理器82
2.9.6 虚拟内存管理83
2.9.7 伪段支持87
2.9.8 64位ARM架构88
2.10 本章小结90
参考资料90
第3章 中断和异常91
3.1 概念和差异91
3.1.1 中断91
3.1.2 异常93
3.1.3 比较93
3.2 异常的分类93
3.2.1 错误类异常93
3.2.2 陷阱类异常94
3.2.3 中止类异常95
3.3 异常例析95
3.3.1 列表95
3.3.2 错误代码97
3.3.3 示例97
3.4 中断/异常的优先级99
3.5 中断/异常处理100
3.5.1 实模式100
3.5.2 保护模式101
3.5.3 IA-32e模式109
3.6 ARM架构中的异常机制110
3.7 本章小结112
参考资料113
第4章 断点和单步执行114
4.1 软件断点114
4.1.1 INT 3114
4.1.2 在调试器中设置断点115
4.1.3 断点命中116
4.1.4 恢复执行118
4.1.5 特殊用途118
4.1.6 断点API119
4.1.7 系统对INT 3的优待119
4.1.8 观察调试器写入的INT 3指令121
4.1.9 归纳和提示122
4.2 硬件断点123
4.2.1 调试寄存器概览123
4.2.2 调试地址寄存器124
4.2.3 调试控制寄存器124
4.2.4 指令断点127
4.2.5 调试异常127
4.2.6 调试状态寄存器128
4.2.7 示例129
4.2.8 硬件断点的设置方法132
4.2.9 归纳134
4.3 陷阱标志135
4.3.1 单步执行标志135
4.3.2 高级语言的单步执行136
4.3.3 任务状态段陷阱标志138
4.3.4 按分支单步执行标志138
4.4 实模式调试器例析140
4.4.1 Debug.exe140
4.4.2 8086 Monitor142
4.4.3 关键实现143
4.5 反调试示例145
4.6 ARM架构的断点支持147
4.6.1 断点指令148
4.6.2 断点寄存器149
4.6.3 监视点寄存器153
4.6.4 单步跟踪155
4.7 本章小结156
参考资料157
第5章 分支记录和性能监视158
5.1 分支监视概览159
5.2 使用寄存器的分支记录159
5.2.1 LBR160
5.2.2 LBR栈161
5.2.3 示例161
5.2.4 在Windows操作系统中的应用165
5.3 使用内存的分支记录166
5.3.1 DS区166
5.3.2 启用DS机制168
5.3.3 调试控制寄存器168
5.4 DS示例:CpuWhere169
5.4.1 驱动程序170
5.4.2 应用界面173
5.4.3 2.0版本175
5.4.4 局限性和扩展建议178
5.4.5 Linux内核中的BTS驱动179
5.5 性能监视180
5.5.1 奔腾处理器的性能监视机制181
5.5.2 P6处理器的性能监视机制182
5.5.3 P4处理器的性能监视183
5.5.4 架构性的性能监视机制186
5.5.5 酷睿微架构处理器的性能监视机制187
5.5.6 资源188
5.6 实时指令追踪188
5.6.1 工作原理189
5.6.2 RTIT数据包190
5.6.3 Linux支持191
5.7 ARM架构的性能监视设施192
5.7.1 PMUvl和PMUv2192
5.7.2 PMUv3194
5.7.3 示例194
5.7.4 CoreSight195
5.8 本章小结195
参考资料195
第6章 机器检查架构196
6.1 奔腾处理器的机器检查机制196
6.2 MCA198
6.2.1 概览198
6.2.2 MCA的全局寄存器199
6.2.3 MCA的错误报告寄存器201
6.2.4 扩展的机器检查状态寄存器202
6.2.5 MCA错误编码203
6.3 编写MCA软件205
6.3.1 基本算法205
6.3.2 示例207
6.3.3 在Windows系统中的应用208
6.3.4 在Linux系统中的应用210
6.4 本章小结212
参考资料212
第7章 JTAG调试213
7.1 简介213
7.1.1 ICE213
7.1.2 JTAG214
7.2 JTAG原理215
7.2.1 边界扫描链路215
7.2.2 TAP信号216
7.2.3 TAP寄存器217
7.2.4 TAP控制器217
7.2.5 TAP指令218
7.3 JTAG应用219
7.3.1 JTAG调试220
7.3.2 调试端口221
7.4 IA处理器的JTAG支持221
7.4.1 P6处理器的JTAG实现221
7.4.2 探测模式223
7.4.3 ITP接口223
7.4.4 XDP端口225
7.4.5 ITP-XDP调试仪226
7.4.6 直接连接接口226
7.4.7 典型应用227
7.5 ARM处理器的JTAG支持227
7.5.1 ARM调试接口228
7.5.2 调试端口228
7.5.3 访问端口229
7.5.4 被调试器件229
7.5.5 调试接插口229
7.5.6 硬件调试器231
7.5.7 DS-5232
7.6 本章小结232
参考资料233
第三篇 GPU及其调试设施237
第8章 GPU基础237
8.1 GPU简史237
8.1.1 从显卡说起237
8.1.2 硬件加速239
8.1.3 可编程和通用化240
8.1.4 三轮演进242
8.2 设备身份243
8.2.1 “喂模式”243
8.2.2 内存复制243
8.2.3 超时检测和复位243
8.2.4 与CPU之并立243
8.3 软件接口244
8.3.1 设备寄存器244
8.3.2 批命令缓冲区245
8.3.3 状态模型245
8.4 GPU驱动模型247
8.4.1 WDDM247
8.4.2 DRI和DRM249
8.5 编程技术250
8.5.1 着色器250
8.5.2 Brook和CUDA251
8.5.3 OpenCL252
8.6 调试设施252
8.6.1 输出调试信息253
8.6.2 发布断点253
8.6.3 其他断点254
8.6.4 单步执行254
8.6.5 观察程序状态254
8.7 本章小结254
参考资料255
第9章 Nvidia GPU及其调试设施256
9.1 概要256
9.1.1 一套微架构256
9.1.2 三条产品线256
9.1.3 封闭257
9.2 微架构257
9.2.1 G80(特斯拉1.0微架构)257
9.2.2 GT200(特斯拉2.0微架构)259
9.2.3 GF100(费米微架构)260
9.2.4 GK 110(开普勒微架构)261
9.2.5 GM107(麦斯威尔微架构)263
9.2.6 GP 104(帕斯卡微架构)263
9.2.7 GV 100(伏特微架构)265
9.2.8 持续改进267
9.3 硬件指令集268
9.3.1 SASS269
9.3.2 指令格式270
9.3.3 谓词执行270
9.3.4 计算能力271
9.3.5 GT200的指令集271
9.3.6 GV100的指令集274
9.4 PTX指令集279
9.4.1 汇编和反汇编280
9.4.2 状态空间282
9.4.3 虚拟寄存器283
9.4.4 数据类型284
9.4.5 指令格式284
9.4.6 内嵌汇编285
9.5 CUDA286
9.5.1 源于Brook286
9.5.2 算核286
9.5.3 执行配置288
9.5.4 内置变量290
9.5.5 Warp291
9.5.6 显式并行292
9.6 异常和陷阱293
9.6.1 陷阱指令293
9.6.2 陷阱后缀293
9.6.3 陷阱处理293
9.7 系统调用296
9.7.1 vprintf296
9.7.2 malloc和free297
9.7.3 assertfail298
9.8 断点指令299
9.8.1 PTX的断点指令299
9.8.2 硬件的断点指令300
9.9 Nsight的断点功能301
9.9.1 源代码断点301
9.9.2 函数断点301
9.9.3 根据线程组和线程编号设置条件断点302
9.10 数据断点304
9.10.1 设置方法304
9.10.2 命中304
9.10.3 数量限制306
9.10.4 设置时机306
9.11 调试符号306
9.11.1 编译选项306
9.11.2 ELF载体306
9.11.3 DWARF307
9.12 CUDA GDB307
9.12.1 通用命令307
9.12.2 扩展308
9.12.3 局限308
9.13 CUDA调试器API308
9.13.1 头文件309
9.13.2 调试事件309
9.13.3 工作原理310
9.14 本章小结312
参考资料312
第10章 AMD GPU及其调试设施314
10.1 演进简史314
10.1.1 三个发展阶段314
10.1.2 两种产品形态315
10.2 Terascale微架构315
10.2.1 总体结构315
10.2.2 SIMD核心317
10.2.3 VLIW317
10.2.4 四类指令318
10.3 GCN微架构318
10.3.1 逻辑结构319
10.3.2 CU和波阵319
10.3.3 内存层次结构321
10.3.4 工作组321
10.3.5 多执行引擎323
10.4 GCN指令集323
10.4.1 7种指令类型323
10.4.2 指令格式324
10.4.3 不再是VLIW指令324
10.4.4 指令手册324
10.5 编程模型325
10.5.1 地幔325
10.5.2 HSA326
10.5.3 ROCm326
10.5.4 Stream SDK和APP SDK327
10.5.5 Linux系统的驱动327
10.6 异常和陷阱327
10.6.1 9种异常328
10.6.2 启用328
10.6.3 陷阱状态寄存器328
10.6.4 陷阱处理器基地址329
10.6.5 陷阱处理过程329
10.7 控制波阵的调试接口330
10.7.1 5种操作330
10.7.2 指定目标330
10.7.3 发送接口331
10.7.4 限制332
10.8 地址监视332
10.8.1 4种监视模式332
10.8.2 数量限制333
10.8.3 报告命中333
10.8.4 寄存器接口333
10.8.5 用户空间接口333
10.9 单步调试支持333
10.9.1 单步调试模式334
10.9.2 控制方法334
10.10 根据调试条件实现分支跳转的指令335
10.10.1 两个条件标志335
10.10.2 4条指令335
10.11 代码断点335
10.11.1 陷阱指令336
10.11.2 在GPU调试SDK中的使用336
10.12 GPU调试模型和开发套件337
10.12.1 组成337
10.12.2 进程内调试模型337
10.12.3 面向事件的调试接口339
10.13 ROCm-GDB340
10.13.1 源代码340
10.13.2 安装和编译340
10.13.3 常用命令340
10.14 本章小结341
参考资料342
第11章 英特尔GPU及其调试设施343
11.1 演进简史343
11.1.1 i740343
11.1.2 集成显卡344
11.1.3 G965345
11.1.4 Larabee345
11.1.5 GPU346
11.1.6 第三轮努力347
11.1.7 公开文档347
11.2 GEN微架构348
11.2.1 总体架构349
11.2.2 片区布局350
11.2.3 子片布局351
11.2.4 EU352
11.2.5 经典架构图353
11.3 寄存器接口354
11.3.1 两大类寄存器354
11.3.2 显示功能的寄存器355
11.4 命令流和环形缓冲区357
11.4.1 命令357
11.4.2 环形缓冲区358
11.4.3 环形缓冲区寄存器359
11.5 逻辑环上下文和执行列表360
11.5.1 LRC360
11.5.2 执行链表提交端口362
11.5.3 理解LRC的提交和执行过程362
11.6 GuC和通过GuC提交任务365
11.6.1 加载固件和启动GuC365
11.6.2 以MMIO方式通信366
11.6.3 基于共享内存的命令传递机制367
11.6.4 提交工作任务367
11.7 媒体流水线368
11.7.1 G965的媒体流水线368
11.7.2 MFX引擎370
11.7.3 状态模型370
11.7.4 多种计算方式371
11.8 EU指令集372
11.8.1 寄存器372
11.8.2 寄存器区块373
11.8.3 指令语法375
11.8.4 VLIW和指令级别并行375
11.9 内存管理377
11.9.1 GGTT377
11.9.2 PPGTT378
11.9.3 I915和GMMLIB379
11.10 异常379
11.10.1 异常类型379
11.10.2 系统过程380
11.11 断点支持381
11.11.1 调试控制位381
11.11.2 操作码匹配断点381
11.11.3 IP匹配断点381
11.11.4 初始断点382
11.12 单步执行382
11.13 GT调试器382
11.13.1 架构382
11.13.2 调试事件384
11.13.3 符号管理385
11.13.4 主要功能385
11.13.5 不足385
11.14 本章小结386
参考资料386
第12章 Mali GPU及其调试设施387
12.1 概况387
12.1.1 源于挪威387
12.1.2 纳入ARM387
12.1.3 三代微架构388
12.1.4 发货最多的图形处理器388
12.1.5 精悍的团队389
12.1.6 封闭的技术文档389
12.1.7 单元化设计389
12.2 Midgard微架构389
12.2.1 逻辑结构390
12.2.2 三流水线着色器核心390
12.2.3 VLIW指令集392
12.3 Bifrost微架构393
12.3.1 逻辑结构393
12.3.2 执行核心394
12.3.3 标量指令集和Warp395
12.4 Mali图形调试器395
12.4.1 双机模式395
12.4.2 面向帧调试396
12.5 Gator396
12.5.1 Gator内核模块(gator.ko)397
12.5.2 Gator文件系统(gatorfs)397
12.5.3 Gator后台服务(gatord)398
12.5.4 Kbase驱动中的gator支持399
12.5.5 含义399
12.6 Kbase驱动的调试设施399
12.6.1 GPU版本报告399
12.6.2 编译选项400
12.6.3 DebugFS下的虚拟文件401
12.6.4 SysFS下的虚拟文件401
12.6.5 基于ftrace的追踪设施401
12.6.6 Kbase的追踪设施402
12.7 其他调试设施403
12.7.1 Caiman403
12.7.2 devlib404
12.7.3 Mali离线编译器404
12.8 缺少的调试设施405
12.8.1 GPGPU调试器405
12.8.2 GPU调试SDK406
12.8.3 反汇编器406
12.8.4 ISA文档406
12.9 本章小结406
参考资料406
第13章 PowerVR GPU及其调试设施407
13.1 概要407
13.1.1 发展简史407
13.1.2 两条产品线409
13.1.3 基于图块延迟渲染409
13.1.4 Intel GMA409
13.1.5 开放性410
13.2 Rogue微架构410
13.2.1 总体结构410
13.2.2 USC411
13.2.3 ALU流水线412
13.3 参考指令集413
13.3.1 寄存器414
13.3.2 指令组414
13.3.3 指令修饰符415
13.3.4 指令类型415
13.3.5 标量指令416
13.3.6 并行模式416
13.4 软件模型和微内核417
13.4.1 软件模型417
13.4.2 微内核的主要功能417
13.4.3 优点418
13.4.4 存在的问题418
13.5 断点支持418
13.5.1 bpret指令419
13.5.2 数据断点419
13.5.3 ISP断点420
13.6 离线编译和反汇编420
13.6.1 离线编译420
13.6.2 反汇编421
13.7 PVR-GDB421
13.7.1 跟踪调试421
13.7.2 寄存器访问422
13.7.3 其他功能422
13.7.4 全局断点和局限性422
13.8 本章小结423
参考资料423
第14章 GPU综述424
14.1 比较424
14.1.1 开放性424
14.1.2 工具链425
14.1.3 开发者文档425
14.2 主要矛盾425
14.2.1 专用性和通用性426
14.2.2 强硬件和弱软件426
14.3 发展趋势426
14.3.1 从固定功能单元到通用执行引擎426
14.3.2 从向量指令到标量指令427
14.3.3 从指令并行到线程并行427
14.4 其他GPU427
14.4.1 Adreno428
14.4.2 VideoCore428
14.4.3 图芯GPU429
14.4.4 TI TMS34010429
14.5 学习资料和工具430
14.5.1 文档430
14.5.2 源代码430
14.5.3 工具431
14.6 本章小结432
参考资料432
第四篇 可调试性435
第15章 可调试性概览435
15.1 简介435
15.2 观止和未雨绸缪436
15.2.1 NT 3.1的故事436
15.2.2 未雨绸缪438
15.3 基本原则439
15.3.1 最短距离原则439
15.3.2 最小范围原则439
15.3.3 立刻终止原则440
15.3.4 可追溯原则441
15.3.5 可控制原则442
15.3.6 可重复原则442
15.3.7 可观察原则442
15.3.8 易辨识原则443
15.3.9 低海森伯效应原则443
15.4 不可调试代码444
15.4.1 系统的异常分发函数444
15.4.2 提供调试功能的系统函数444
15.4.3 对调试器敏感的函数445
15.4.4 反跟踪和调试的程序445
15.4.5 时间敏感的代码446
15.4.6 应对措施446
15.5 可调试性例析446
15.5.1 健康性检查和BSOD447
15.5.2 可控制性447
15.5.3 公开的符号文件448
15.5.4 WER448
15.5.5 ETW和日志448
15.5.6 性能计数器449
15.5.7 内置的内核调试引擎449
15.5.8 手动触发崩溃449
15.6 与安全、商业秘密和性能的关系449
15.6.1 可调试性与安全性450
15.6.2 可调试性与商业秘密450
15.6.3 可调试性与性能450
15.7 本章小结450
参考资料451
第16章 可调试性的实现452
16.1 角色和职责452
16.1.1 架构师452
16.1.2 程序员453
16.1.3 测试人员453
16.1.4 产品维护和技术支持工程师454
16.1.5 管理者454
16.2 可调试架构455
16.2.1 日志455
16.2.2 输出调试信息456
16.2.3 转储457
16.2.4 基类458
16.2.5 调试模型458
16.3 通过栈回溯实现可追溯性459
16.3.1 栈回溯的基本原理459
16.3.2 利用DbgHelp函数库回溯栈461
16.3.3 利用RTL函数回溯栈465
16.4 数据的可追溯性466
16.4.1 基于数据断点的方法466
16.4.2 使用对象封装技术来追踪数据变化471
16.5 可观察性的实现472
16.5.1 状态查询472
16.5.2 WMI473
16.5.3 性能计数器475
16.5.4 转储478
16.5.5 打印或者输出调试信息479
16.5.6 日志480
16.6 自检和自动报告480
16.6.1 BIST480
16.6.2 软件自检481
16.6.3 自动报告482
16.7 本章小结482
参考资料483
平淡天真·代跋484