Reviewed: January 2014
There aren’t many books like this about, and their scarcity increases their value. Clearly this is aimed at the undergraduate, and I felt that I missed out a lot by not doing the exercises (my excuse is that I do most of my reading over breakfast or on public transport).
The authors try to cover computer systems from the ground up. After the basics, they go into lengthy coverage of machine code. Next up is a cover the basics of processor design, developing a simplified x66 basic processor (which they call y86). This is then enhanced by adding pipelining, out-of-order execution and an explanation of hazards. The next chapter is on performance from the perspective of the compiler and the code that it has to deal with. The last chapter in the first section covers caches and the memory hierarchy.
Section 2 kicks off with a chapter on linking, a topic that generally gets little coverage. After this, as the topics get to higher levels of computer systems, I felt that the ground was better trodden and the scarcity value decreased. The last few chapters cover Unix systems programming in the same vein as W. Richard Stevens. Some of the low level C stuff was lacking government health warnings – setjmp/ longjmp are described without saying anything about C++ exceptions and threads. I was a bit disappointed that the chapter on threading didn’t get down to instruction reordering and its impact on thread safety.