Changes from the First Edition
The first edition of this book was published with a copyright of 2003.
Considering the rapid evolution of computer technology, the book
content held up surprisingly well. Intel IA32 machines running
Unix-like operating systems and programmed in C proved to be a
combination that continues to encompass many systems today. Changes
in hardware technology and compilers and our own experience in
teaching the material have prompted a substantial revision.
Here are some of the more significant changes:
- Chapter 2: Representing and Manipulating Information.
We have tried to make this material more accessible, with more careful
explanations of concepts and with many more practice and homework
problems. We moved some of the more theoretical aspects to web
asides. We also describe some of the security vulnerabilities that
arise due to the overflow properties of computer arithmetic.
- Chapter 3: Machine-Level Representation of Programs.
We have extended our coverage to include x86-64, the extension of x86 processors
to a 64-bit word size. We also use the code generated by a more
recent version of gcc. We have enhanced our coverage of buffer
overflow vulnerabilities. We have created web asides on two different
classes of instructions for floating point, and also a view of the
more exotic transformations made when compilers attempt higher degrees
of optimization.
- Chapter 4: Processor Architecture.
We include a more careful exposition of exception detection and handling
in our processor design. We have also created a web aside showing a
mapping of our processor designs into Verilog, enabling synthesis into
working hardware.
- Chapter 5: Optimizing Program Performance.
We have greatly changed our description of how an out-of-order
processor operates and have created a simple technique for analyzing
program performance based on the paths in a data-flow graph
representation of a program.
A web aside describes how C programmers can write programs that
make use of the SIMD (single-instruction, multiple-data) instructions
found in more recent versions of x86 processors.
- Chapter 6: The Memory Hierarchy.
We have added material in solid-state disks, and we have updated our
presentation to be based on the memory hierarchy of an Intel Core i7 processor.
- Chapters 7: Linking, Chapter 10: System-Level I/O, and Chapter 11: Network Programming.
These chapters have changed only slightly.
This chapter has changed only slightly.
- Chapter 8: Exceptional Control Flow.
We have enhanced our discussion of how the process model introduces
some fundamental concepts of concurrency, such as nondeterminism.
- Chapter 9: Virtual Memory.
We have updated our memory system case study to describe the 64-bit
Intel Core i7 processor. We have also updated our sample
implementation of malloc to work for both 32 and 64-bit
execution.
- Chapter 12: Concurrent Programming.
We have increased our coverage of the general principles of
concurrency, and we also describe how programmers can use thread-level
parallelism to make programs run faster on multi-core machines.
The old Chapter 9 (Measuring Program Execution Time), has been
deleted. In addition, we have added and revised a number of practice
and homework problems.