| |
| |
Preface | |
| |
| |
A Tour of Computer Systems | |
| |
| |
Information Is Bits + Context | |
| |
| |
Programs Are Translated by Other Programs into Different Forms | |
| |
| |
It Pays to Understand How Compilation Systems Work | |
| |
| |
Processors Read and Interpret Instructions Stored in Memory. Caches Matter | |
| |
| |
Storage Devices Form a Hierarchy | |
| |
| |
The Operating System Manages the Hardware | |
| |
| |
Systems Communicate with Other Systems Using Networks | |
| |
| |
The Next Step | |
| |
| |
Program Structure and Execution | |
| |
| |
Representing and Manipulating Information | |
| |
| |
Information Storage | |
| |
| |
Integer Representations | |
| |
| |
Integer Arithmetic | |
| |
| |
Floating Point | |
| |
| |
Machine-Level Representation of Programs | |
| |
| |
A Historical Perspective | |
| |
| |
Program Encodings | |
| |
| |
Data Formats | |
| |
| |
Accessing Information | |
| |
| |
Arithmetic and Logical Operations | |
| |
| |
Control | |
| |
| |
Procedures | |
| |
| |
Array Allocation and Access | |
| |
| |
Heterogeneous Data Structures | |
| |
| |
Alignment | |
| |
| |
Putting It Together: Understanding Pointers | |
| |
| |
Life in the Real World: Using the GDB Debugger | |
| |
| |
Out-of-Bounds Memory References and Buffer Overflow | |
| |
| |
Floating-Point Code | |
| |
| |
Embedding Assembly Code in C Programs | |
| |
| |
Processor Architecture | |
| |
| |
The Y86 Instruction Set Architecture | |
| |
| |
Overview of Logic Design and the Hardware Control Language | |
| |
| |
A Sequential Implementation | |
| |
| |
General Principles of Pipelining | |
| |
| |
Pipelined Implementations | |
| |
| |
Optimizing Program Performance | |
| |
| |
Capabilities and Limitations of Optimizing Compilers | |
| |
| |
Expressing Program Performance | |
| |
| |
Program Example | |
| |
| |
Eliminating Loop Inefficiencies | |
| |
| |
Reducing Procedure Calls | |
| |
| |
Eliminating Unneeded Memory References | |
| |
| |
Understanding Modern Processors | |
| |
| |
Reducing Loop Overhead | |
| |
| |
Converting to Pointer Code | |
| |
| |
Enhancing Parallelism | |
| |
| |
Putting It Together: Summary of Results for Optimizing Combining Code | |
| |
| |
Branch Prediction and Misprediction Penalties | |
| |
| |
Understanding Memory Performance | |
| |
| |
Life in the Real World: Performance Improvement Techniques | |
| |
| |
Identifying and Eliminating Performance Bottlenecks | |
| |
| |
The Memory Hierarchy | |
| |
| |
Storage Technologies | |
| |
| |
Locality | |
| |
| |
The Memory Hierarchy | |
| |
| |
Cache Memories | |
| |
| |
Writing Cache-Friendly Code | |
| |
| |
Putting It Together: Exploiting Locality in Your Programs | |
| |
| |
Running Programs on a System | |
| |
| |
Linking | |
| |
| |
Compiler Drivers | |
| |
| |
Static Linking | |
| |
| |
Object Files | |
| |
| |
Relocatable Object Files | |
| |
| |
Symbols and Symbol Tables | |
| |
| |
Symbol Resolution | |
| |
| |
Relocation | |
| |
| |
Executable Object Files | |
| |
| |
Loading Executable Object Files | |
| |
| |
Dynamic Linking with Shared Libraries | |
| |
| |
Loading and Linking Shared Libraries from Applications | |
| |
| |
Position-Independent Code (PIC) | |
| |
| |
Tools for Manipulating Object Files | |
| |
| |
Exceptional Control Flow | |
| |
| |
Exceptions | |
| |
| |
Processes | |
| |
| |
System Calls and Error Handling | |
| |
| |
Process Control | |
| |
| |
Signals | |
| |
| |
Nonlocal Jumps | |
| |
| |
Tools for Manipulating Processes | |
| |
| |
Measuring Program Execution Time | |
| |
| |
The Flow of Time on a Computer Systems | |
| |
| |
Measuring Time by Interval Counting | |
| |
| |
Cycle Counters | |
| |
| |
Measuring Program Execution Time with Cycle Counters | |
| |
| |
Time-of-Day Measurements | |
| |
| |
Putting It Together: An Experimental Protocol | |
| |
| |
Looking into the Future | |
| |
| |
Life in the Real World: An Implementation of theK-Best Measurement Scheme | |
| |
| |
Lessons Learned | |
| |
| |
Virtual Memory. P | |