第一章 计算机系统漫游
由GCC编译的C程序“Hello, World” ,通过研究程序的生命周期,介绍计算机系统的主要概念和主题。
第二章 信息的表示和处理
讲述了计算机的算术运算,重点描述了无符号数和数的补码表示的特性。就会发现,用补码表示的两个正数的和或者积可能为负。
补码的算术运算满足很多整数运算的代数特性,编译器可以安全地把一个常量乘法转化为一系列的移位和加法。
IEEEE标准的浮点格式:一是如何用它来表示数值,一是浮点运算的数学属性。
对计算机的算术运算有深刻的理解是写出可靠程序的关键。比如,不能以表达式(x-y<0)来替代(x<y),因为前者可能会产生溢出。且不能用(-y<-x)来代替,因为补码表示中负数和正数的范围是不对称的。算术溢出是造成程序错误和安全漏洞的一个常见根源。
第三章 程序的机器级表示
如何阅读由c编译器生成的x86-64机器代码。分析程序在机器上是如何表示的。
讲述不同控制结构(条件,循环和开关等语句)生成的基本指令模式,还讲述了过程的实现,包括栈的分配、寄存器使用惯例和参数传递。
讨论不同数据结构(如结构、联合和数组)的分配和访问方式。实现整数和浮点数算术运算的指令。对指针有非常全面而具体的理解。
第四章 处理器体系结构
讲述基本的组合时序逻辑元素,并展示这些元素如何在数据通路中组合到一起,来执行x86-64指令集的一个称为“Y86-64”的简化子集。
从设计单时钟周期数据通路开始,引入流水线的思想,将处理一条指令所需要的不同步骤实现为独立的阶段。优势在于可以在每个阶段都可以处理不同的指令。
处理器设计的控制逻辑是用一种称为HCL的简单硬件描述语言来描述的。
第五章 优化程序性能
主要思想通过生成机器代码来学习编写C语言。
以减少程序需要做的工作量为目的,如何根据一个程序的图形化表示中的关键路径来测量一个程序可能的性能
通过简单的操作模型,来解释能够提高程序在现代“超标量”处理器上性能的变换之有效的原理。
第六章 存储器层次结构
存储器系统是一个由不同容量、造价和访问时间的存储设备组成的层次结构。
讲述了随机存取存储器(RAM)和只读存储器(ROM)、磁盘和固态硬盘的几何形状和组织构造。
阐述如何通过改善程序的时间局部性和空间局部性来提高应用程序的性能。
第七章 链接
讲述静态和动态链接。
概念有可重定位的 和可执行的目标文件、符号解析、重定位、静态库、共享目标库、位置无关代码,以及库打桩。
连接器生成的目标文件是与一些像加载、虚拟内存和内存映射这样的概念相关的。
第八章 异常控制流
异常控制流(即除正常分支和过程调用以外的控制流的变化)的一半概念,打破单一程序的模型。
从底层的硬件异常和中断,到并发进程的上下文切换,到由于接收Linux信号引起的控制流突变,到C语言中破坏栈原则的非本地跳转。
进程的基本概念,创建和操纵。如何通过Linux系统调用多个进程。
第九章 虚拟内存
讲述虚拟内存的特性以及如何工作,不同的并发进程各自都有一个完全相同的地址范围,能共享某些页,而又独占另外一些页。
讨论存储分配操作,如标准库的malloc和free操作。虚拟内存空间只是一个字节数组,程序可以把它划分为不同的存储单元。
展现将计算机系统中的硬件和软件结合起来阐述的优点。
第十章 系统级I/O
讲述UnixI/O的基本概念。例如文件和描述符。
如何共享文件,I/O重定向是如何工作的,还有如何访问文件的元数据
开发一个健壮的带缓冲区的I/O包,可以处理一种 short counts的奇特行为,并谈到I/O的局限性
第十一章 网络编程
网络是非常有趣的I/O设备,联系所学的概念,能够编写一个简单的web服务器。
讲述网络程序底层的客户端-服务器模型。
如何使用套接字接口来编写Internet客户端和服务器。
介绍超文本传输协议(HTTP),并开发简单的迭代式Web服务器。
第十二章 并发编程
以Internet服务器设计为例介绍并发编程。
编写并发程序的三种基本机制(进程、I/O多路复用和线程)。
用P、V信号量操作来实现同步、线程安全和可重入、竞争条件以及死锁等的基本原则。
讲述了线程级编程的使用方法,表达应用程序的并行性。
使用所有的核解决同一个计算问题,协调并发线程,既保证正确性,又要争取高性能。