XXIX 2.1.7C语言中的位级运算…37 3.2.3关于格式的注解… 117 2.1.8C语言中的逻辑运算…39 3.3数据格式…… 119 2.1.9C语言中的移位运算……40 3.4访问信息………… 119 2.2整数表示…………41 3.4.1操作数指示符 ……121 2.2.1整型数据类型……42 3.4.2数据传送指令 …122 2.2.2无符号数的编码……43 3.4.3数据传送示例 125 2.2.3补码编码……44 3.4.4压入和弹出栈数据 …127 2.2.4有符号数和无符号数之间的 3.5算术和逻辑操作… 128 转换……………………49 3.5.1加载有效地址 129 2.2.5C语言中的有符号数与 3.5.2一元和二元操作 130 无符号数…………52 3.5.3移位操作…131 2.2.6扩展一个数字的位表示…54 3.5.4讨论……………… 131 2.2.7截断数字……… 56 3.5.5特殊的算术操作… 133 2.2.8关于有符号数与无符号数的 3.6控制……135 建议…………………58 3.6.1条件码………… 135 2.3整数运算…………… 60 3.6.2访问条件码… 136 2.3.1无符号加法………… 60 3.6.3跳转指令……138 2.3.2补码加法 62 3.6.4跳转指令的编码… 139 2.3.3补码的非…………66 3.6.5用条件控制来实现条件分支…141 2.3.4无符号乘法……67 3.6.6用条件传送来实现条件分支…145 2.3.5补码乘法………… 67 3.6.7循环…149 2.3.6乘以常数…… 70 3.6.8 switch语句………… 159 2.3.7除以2的幂… 71 3.7过程……… 164 2.3.8关于整数运算的最后思考…74 3.7.1运行时栈…………… 164 2.4浮点数……75 3.7.2转移控制… 165 2.4.1二进制小数……… 76 3.7.3数据传送………………168 2.4.2IEEE浮点表示… 78 3.7.4栈上的局部存储… 170 2.4.3数字示例……79 3.7.5寄存器中的局部存储空间…172 2.4.4舍入… 83 3.7.6递归过程………174 2.4.5浮点运算………… 85 3.8数组分配和访问 ………176 2.4.6。C语言中的浮点数… 86 3.8.1基本原则……… 176 2.5小结 4…*… 87 3.8.2指针运算 177 参考文献说明…………………88 3.8.3嵌套的数组 …………178 家庭作业… 88 3.8.4定长数组………179 练习题答案…… 97 3.8.5变长数组…………181 3.9异质的数据结构 183 第3章程序的机器级表示……109 3.9.1结构………183 3.1历史观点 ………110 3.9,2联合…… 186 3.2程序编码 113 3.9.3数据对齐 189 3.2.1机器级代码 113 3.10在机器级程序中将控制与 3.2.2代码示例……114 数据结合起来……192
XXX 3.10.1理解指针………+192 4.4流水线的通用原理+……282 3.10.2应用:使用GDB调试器…193 4.4.1计算流水线…282 3.10.3内存越界引用和缓冲区 4.4.2流水线操作的详细说明·284 溢出………………………194 4.4.3流水线的局限性……284 3.10.4对抗缓冲区溢出攻击…198 4.4.4带反情的流水线系统…… 287 3.10.5支持变长栈桢…… 201 4.5Y86-64的流水线实现…288 3.11浮点代码…… 204 4.5.1SEQ十:重新安排计算 3.11.1浮点传送和转换操作… 205 阶段………………………288 3.11.2过程中的浮点代码… 209 4.5.2插入流水线寄存器…289 3.11.3浮点运算操作……… 210 4.5.3对信号进行重新排列和 3.11.4定义和使用浮点常数…212 标号…………292 3.11.5在浮点代码中使用位级 4.5.4预测下一个P℃…293 操作…………………212 4.5.5流水线冒险… 295 3.11.6浮点比较操作… 213 4.5.6异常处理……306 3.11.7对浮,点代码的观察结论·215 4.5.7PIPE各阶段的实现…·308 3.12小结……………………………216 4.5.8流水线控制逻辑…… 314 参考文献说明………………… 216 4.5.9性能分析… 322 家庭作业 216 4.5.10未完成的工作……323 练习题答案…… 226 4.6小结 0*4……………… 325 参考文献说明………… 326 第4章处理器体系结构………… 243 家庭作业 ++。g。。 327 4,1Y86-64指令集体系结构… 245 练习题答案…331 4.1.1程序员可见的状态… 245 4.1.2Y86-64指令…245 第5章优化程序性能… 341 4.1.3指令编码………………246 5.1优化编译器的能力和局限性 …342 4.1.4Y86-64异常………·250 5.2 表示程序性能 345 4.1.5Y86-64程序… 251 5.3程序示例 347 4.1.6一些Y8664指令的详情· 255 5.4消除循环的低效率 350 4.2逻辑设计和硬件控制语言HCL·256 5.5减少过程调用 353 4.2.1逻辑门…………… 257 5.6 消除不必要的内存引用 354 4.2.2组合电路和HCL布尔 5.7理解现代处理器 357 表达式……………257 5.7.1整体操作 357 4.2.3宇级的组合电路和HCL 5.7.2功能单元的性能 361 整数表达式…………258 5.7.3处理器操作的抽象模型…362 4,2.4集合关系……………261 5.8循环展开……………… 366 4.2.5存储器和时钟 262 5.9提高并行性 044…44……4” 369 4.3Y86-64的顺序实现 ………264 5.9.1多个累积变量 ………… 370 4.3.1将处理组织成阶段 ……264 5.9.2重新结合变换 … 373 4.3.2SEQ硬件结构 272 5.10优化合并代码的结果小结…377 4.3.3SEQ的时序… 274 5.11一些限制因素…378 4.3.4SEQ阶段的实现…277 5.11.1寄存器溢出…378
XXXI 5.11.2分支预测和预测错误 6.3存储器层次结构……421 处罚………379 6.3.1存储器层次结构中的缓存…422 5.12理解内存性能…382 6.3.2存储器层次结构概念小结…424 5.12.1加载的性能…382 6.4高速缓存存储器……425 5.12.2存储的性能…… 383 6.4.1通用的高速缓存存储器 5.13应用:性能提高技术…387 组织结构…… 425 5.14确认和消除性能瓶颈 388 6.4.2直接映射高速缓存… 427 5.14.1程序剖析…388 6,4,3组相联高速缓存·…· 433 5.14.2使用剖析程序来指导 6.4.4全相联高速缓存 …*434 优化………390 6.4.5有关写的问题…… 437 5.15小结……392 6.4.6一个真实的高速缓存层次 参考文献说明…………………393 结构的解剖……………438 家庭作业………… 393 6.4.7高速缓存参数的性能影响·439 练习题答案………395 6.5编写高速缓存友好的代码·440 6.6综合:高速缓存对程序性能的 第6章存储器层次结构……399 影响………………444 6.1存储技术……………… 399 6,6,1存储器山… 444 6.1.1随机访问存储器 …400 6.6.2重新排列循环以提高空间 6.1.2磁盘存储……406 局部姓……………………447 6.1.3固态硬盘……… 414 6.6.3在程序中利用局部性…450 6.1.4存储技术趋势…… 415 6.7小结……………450 6.2局部性………… 418 参考文献说明………… 451 6.2.1对程序数据引用的局部性…418 家庭作业 451 6.2.2取指令的局部性 419 练习题答案……459 ,6.2.3局部性小结 420 第二部分 在系统上运行程序 第7章链接…………464 7.7重定位…………478 7.1编译器驱动程序 ……465 7.7.1重定位条目………479 7.2静态链接 466 7.7.2重定位符号引用 479 7.3目标文件…… 466 7.8可执行目标文件…… 483 7.4可重定位目标文件 ……………467 7.9加载可执行目标文件 ………484 7.5符号和符号表…… 468 7.10动态链接共享库…………485 7.6符号解析 470 7.11从应用程序中加载和链接 7.6.1链接器如何解析多重定义 共享库………487 的全局符号……471 7.12位置无关代码…… 489 7.6.2与静态库链接… 475 7.13库打桩机制………492 7.6.3链接器如何使用静态库来 7.13.1编译时打桩… 492 解析引用…477 7.13.2链接时打桩………492
XXXII 7.13.3运行时打桩……494 练习题答案……556 7.14处理目标文件的工具 496 7.15小结……… 第9章虚拟内存………559 496 参考文献说明……… 497 9.1物理和虚拟寻址 ……… 560 家庭作业…… 497 9.2地址空间……… 560 练习题答案……………… 499 9.3虚拟内存作为缓存的工具…561 9.3.1DRAM线存的组织结构··562 第8章异常控制流…………501 9.3.2页表……562 8.1异常…*4……*… 502 9.3.3页命中………………… 563 8.1.1异常处理 00400… 503 9.3.4缺页…………………… 564 8.1.2异常的类别 504 9.3.5分配页面 565 8.1.3 Linux/x86-64系统中的 9.3.6又是局部性救了我们 565 异常…505 9.4虚拟内存作为内存管理的 8.2进程…………508 工具…***565 8.2.1逻辑控制流…508 9.5虚拟内存作为内存保护的 8.2.2并发流…… 工具………567 509 9.6地址翻泽………………·567 8.2.3私有地址空间………… 509 8.2.4用户模式和内核模式…510 9.6.1结合高速缓存和虚拟 内存………570 8.2.5上下文切换……………511 9.6.2利用TLB加速地址翻译…570 8.3系统调用错误处理 512 9.6.3多级页表…571 8.4进程控制…………………… 513 9.6.4综合:端到端的地址翻译·573 8.4.1获取进程1D…513 9.7案例研究:Intel Core i7/Linux 8.4.2创建和终止进程 513 内存系统……576 8.4.3回收子进程……… 516 9.7.1 Core i7地址翻译 +4044444” 576 8.4.4让进程休眠…………… 521 9.7.2 Linux虚拟内存系统…580 8.4.5加载并运行程序 4*。 521 9.8内存映射………… 582 8.4.6利用fork和execve运行 9.8.1再看共享对象… 583 程序 524 9.8.2再看fork函数…584 8.5信号 526 9.8.3再看execve函数…584 8.5.1信号术语 527 9.8.4使用mmap函数的用户级 8.5.2发送信号………… 528 内存映射…… 585 8.5.3接收信号……… 531 9.9动态内存分配…… 587 8.5.4阻塞和解除阻塞信号… 532 9.9.1 malloc和free函数 587 8.5.5编写信号处理程序 …533 9.9.2为什么要使用动态内存 8.5.6同步流以避免讨厌的并发 分配………589 错误……………540 9.9.3分配器的要求和目标…· 590 8.5.7显式地等待信号 543 9.9.4碎片 591 8.6非本地跳转……546 9.9.5实现问题 4…+0400:+044” 592 8.7操作进程的工具 550 9.9.6隐式空闲链表 0444。 592 8.8小结 550 9.9.7放置已分配的块 …………593 参考文献说明……… 550 9.9.8分割空闲块…594 家庭作业… 550 9.9.9获取额外的堆内存 +*……594
XXXIII 9.9.10合并空闲块… 594 9.11.2读未初始化的内存…609 9.9.11带边界标记的合并…595 9.11.3允许栈缓冲区溢出 ……610 9.9.12综合:实现一个简单的 9.11.4假设指针和它们指向的 分配器…597 对象是相同大小的……610 9.9.13显式空闲链表……603 9.11.5造成错位错误…611 9.9.14分离的空闲链表… 604 9.11.6引用指针,而不是它所 9.10垃圾收集…………… 605 指向的对象……611 9.10.1垃圾收集器的基本知识…606 9.11.7误解指针运算…611 9.10.2Mark&Sweep垃圾 9.11.8引用不存在的变量…612 收集器…… 607 9.11.9引用空闲堆块中的数据·612 9.10.3C程序的保守Mark& 9.11.10引起内存泄漏 613 Sweep…………608 9.12小结… 613 9.11C程序中常见的与内存有关的 参考文献说明… 613 错误………………609 家庭作业 614 9.11.1间接引用坏指针 *…609 练习题答案 617 第三部分 程序间的交互和通信 第10章系统级10 …622 第11章网络编程…………642 10.1 Unix I/O 622 11.1客户端-服务器编程模型 …… 642 10.2文件……623 11.2网络………………… 643 10.3打开和关闭文件…………… 624 11.3全球IP因特网 646 10.4读和写文件……… 625 11.3.11P地址…647 649 10.5用RI0包健壮地读写… 626 11.3.2因特网城名…… 651 10.5.1RI0的无缓冲的输入输出 11.3.3因特网连接… 函数……627 11.4套接字接口… 652 11.4.1套接字地址结构… 653 10.5.2RI0的带缓冲的输入 11.4.2 socket函数 654 函数…………………… 627 11.4.3 connect函数… 654 10.6读取文件元数据………632 11.4.4bind函数………… 654 10.7读取目录内容…… 633 11.4.51 isten函数 655 10.8共享文件………………… 634 11.4.6 accept函数 655 10.91/0重定向… 637 11.4.7主机和服务的转换……… 656 10.10标准I/O 638 11.4.8套接字接口的辅助函数…660 10.11综合:我该使用哪些1/O 1l.4.9echo客户端和服务器的 函数?… 638 示例… 662 10.12小结… 640 11.5Web服务器… 665 参考文献说明……………… 640 11.5.1Web基础… 665 家庭作业 640 11.5.2Web内容…666 练习题答案… 641 11.5.3HTTP事务… 667